Исходный код этой игры открыт, поэтому я решил проверить его. В нем я нашел что-то вроде:
// 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
кажется излишним.
Есть предположения?
LeftOrRightCharacterHolder
, ответ - переместитьclient->GetCharacterData()->Inventory()
за пределы метода. - person Grim   schedule 25.06.2016