c++ - 得墨忒耳法则和异界转移

标签 c++ law-of-demeter

这个游戏的源代码是开源的,所以我决定去看看。在其中,我发现了类似的东西:

// 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/

相关文章:

c++ - 重写 C/C++ 中的方法,例如 Delphi

c++ - 为什么将类中的数据声明为私有(private)的示例很重要?

c++ - tf2_ros::Buffer::canTransform() 为现有转换返回 False

c++ - 如何重构此代码层次结构(与 Demeter 法则相关​​)

c++ - QT qScriptConnect 不工作

c++ - NSMutableArray insertObject :(id) atIndex:int inserting a void ptr

php - 工厂方法可能违反 Demeter 法则?

java - 得墨忒耳法则 - 为什么我需要使用 setter/getter ?

domain-driven-design - 聚合根数据重复和得墨忒耳定律