Исходный код этой игры - с открытым исходным кодом, поэтому я решил проверить это. В этом я нашел что-то вроде:Закон деметры и планировки
// 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);
, он все равно будет нарушать закон demeter (насколько я знаю).
Что можно сделать по этому поводу? или это одно из мест, где LOD не применяется [как в моем втором примере]?
Перемещение GetInventoryItem
до client
класс не имеет смысла в моей точке зрения, так как клиент не имеет никакого отношения к character
.
Создание оберток в классе client
для всех методов xx класс character
кажется излишним.
Любые мысли?
«Закон Деметры» - действительно «Руководящий принцип Деметры». Этот вопрос слишком субъективен для переполнения стека, потому что это вопрос стиля кодирования, как люди предпочитают создавать какую-либо функцию. Если вы хотите просмотреть высококачественную исходную кодовую базу кода, попробуйте Doom 3: http://fabiensanglard.net/doom3/ –
@DietrichEpp Источник планетарной версии - серверная сторона. Судьба - только клиент. – James
Это неверно. Источник Doom 3 не является клиентом. –