Der Quellcode dieses Spiels ist Open Source, also entschied ich mich, es auszuprobieren. Darin fand ich etwas wie:Gesetz von Demeter und Planeshift
// 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);
}
Die erste Zeile, um den Artikel zu erhalten, verstößt eindeutig gegen das Gesetz von Demeter. Aber selbst wenn es in client->GetCharacterData()->GetInventoryItem(PSCHARACTER_SLOT_RIGHTHAND);
geändert würde, würde es immer noch das Demeter-Gesetz verletzen (soweit ich weiß).
Was kann dagegen getan werden? oder ist das einer der Orte, wo LOD nicht gilt [wie in meinem zweiten Beispiel]?
Das Verschieben der GetInventoryItem
Klasse client
macht aus meiner Sicht keinen Sinn, da der Client nichts mit der character
zu tun hat.
Erstellen von Wrappern in der client
Klasse für alle xx-Methoden scheint die character
Klasse zu übertreiben.
Irgendwelche Gedanken?
Das "Gesetz von Demeter" ist wirklich eine "Richtlinie von Demeter". Diese Frage ist für Stack Overflow ein bisschen zu subjektiv, weil es eine Frage des Codierungsstils ist, wie die Leute ein Feature entwerfen möchten. Wenn Sie eine qualitativ hochwertige Open-Source-Spielcodebasis überprüfen möchten, versuchen Sie Doom 3: http://fabiensanglard.net/doom3/ –
@DietrichEpp Die Planeshift-Quelle ist serverseitig tho. Das Doom ist nur Client. – James
Das ist falsch. Die Doom 3-Quelle ist nicht nur Client. –