закон деметры и смещения плоскости

Исходный код этой игры открыт, поэтому я решил проверить его. В нем я нашел что-то вроде:

// 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 кажется излишним.

Есть предположения?


person Gam    schedule 20.06.2016    source источник
comment
Закон Деметры на самом деле является руководством Деметры. Этот вопрос слишком субъективен для Stack Overflow, потому что это вопрос стиля кодирования, как люди предпочли бы разработать какую-либо функцию. Если вы хотите просмотреть высококачественную базу игрового кода с открытым исходным кодом, попробуйте Doom 3: fabiensanglard.net/doom3   -  person Dietrich Epp    schedule 20.06.2016
comment
@DietrichEpp Источник planeshift находится на стороне сервера. Гибель только для клиента.   -  person Gam    schedule 20.06.2016
comment
Это неверно. Исходный код Doom 3 - это не только клиент.   -  person Dietrich Epp    schedule 20.06.2016
comment
@DietrichEpp, тогда где проект игрового сервера doom3? Я не могу его найти.   -  person Gam    schedule 20.06.2016
comment
Это действительно зависит от обстоятельств! Как вы могли заметить, вопрос, за который проголосовали «близко», является слишком широким и в первую очередь основанным на мнениях, попробуйте конкретизировать. Если имя класса LeftOrRightCharacterHolder, ответ - переместить client->GetCharacterData()->Inventory() за пределы метода.   -  person Grim    schedule 25.06.2016


Ответы (1)


Как вы предполагаете, если вы хотите полностью следовать 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 следует рассматривать как руководство, а не как закон. С другой стороны, по моему личному опыту, часто ломайте его, и у вас будут проблемы ... :)

person Joris    schedule 20.06.2016