【发布时间】:2016-06-20 06:52:16
【问题描述】:
这个游戏的源代码是开源的,所以我决定去看看。在其中,我发现了类似的内容:
// This ActionManager is basically a controller like in the MVC pattern.
void ActionManager::HandleQueryMessage(csString xml, Client* client)
{
//check the two hands as a start.
psItem* item = client->GetCharacterData()->Inventory().GetInventoryItem(PSCHARACTER_SLOT_RIGHTHAND);
if(!item || !item->GetItemCommand().Length())
item = client->GetCharacterData()->Inventory().GetInventoryItem(PSCHARACTER_SLOT_LEFTHAND);
}
获得物品的第一行明显违反了德米特法则。不过就算改成client->GetCharacterData()->GetInventoryItem(PSCHARACTER_SLOT_RIGHTHAND);,还是违反了德墨忒耳定律(据我所知)。
对此可以做些什么?或者这是 LOD 不适用的地方之一(如我的第二个示例中所示)?
在我看来,将GetInventoryItem 移动到client 类没有意义,因为客户端与character 无关。
在 client 类中为 character 类的所有 xx 方法创建包装器似乎有点过头了。
有什么想法吗?
【问题讨论】:
-
“得墨忒耳法则”实际上是“得墨忒耳的指南”。这个问题对于 Stack Overflow 来说有点太主观了,因为这是一个编码风格的问题,人们更喜欢如何设计某些功能。如果您想查看高质量的开源游戏代码库,请尝试 Doom 3:fabiensanglard.net/doom3
-
@DietrichEpp planeshift 源是服务器端的。厄运只是客户端。
-
这是不正确的。 《毁灭战士 3》的来源不仅仅是客户端。
-
@DietrichEpp 那么毁灭战士3游戏服务器的项目在哪里?我找不到它。
-
这真的取决于!您可能会注意到投票赞成关闭的问题“过于宽泛”和“主要基于意见”,请尝试具体化。如果类的名称是
LeftOrRightCharacterHolder,则答案是将client->GetCharacterData()->Inventory()移出方法。
标签: c++ law-of-demeter