这个游戏的源代码是开源的,所以我决定去看看。在其中,我发现了类似的东西:
// 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
中创建包装器所有 xx 方法的类 character
类似乎矫枉过正。
有什么想法吗?
最佳答案
正如您自己建议的那样,如果您想完全遵循 LOD,您需要像...这样的功能
Item* Client::GetCharacterInventoryItem(int itemID)
{
return characterData->getInventoryItem(itemId);
}
/* ... */
Item* CharacterData::getInventoryItem(int itemID)
{
return inventory->getItem(itemId)
}
/* ... */
Item* Inventory::getItem(int itemID)
{
assert_valid_itemID(itemID);
return inventory_table[itemId];
}
这种额外的间接寻址值得吗?我不知道,这取决于具体情况、您的个人喜好等。正如评论所指出的,LOD 应被视为指南,而不是真正的法律。另一方面,根据我个人的经验,经常打破它,你会遇到麻烦......:)
关于c++ - 得墨忒耳法则和异界转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37916206/