该游戏的源代码是开放源代码,因此我决定对其进行检查。在其中,我发现了以下内容:
// 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);
}
获得物品的第一行显然违反了得墨meter耳的定律。但是,即使将其更改为
client->GetCharacterData()->GetInventoryItem(PSCHARACTER_SLOT_RIGHTHAND);
,它仍然会违反demeter的定律(据我所知)。该怎么办?还是这是不适用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应该被视为准则,而不是真正的法律。另一方面,以我的个人经验,经常破坏它会遇到麻烦... :)