2016-06-20 3 views
1

このゲームのソースコードはオープンソースなので、私はそれを調べることにしました。その中で、私のようなものを見つけました:demeterと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); 
} 

アイテムを取得するための最初のラインがはっきりとデメテルの法則に違反します。しかし、たとえそれがclient->GetCharacterData()->GetInventoryItem(PSCHARACTER_SLOT_RIGHTHAND);に変更されたとしても、それは(私が知る限り)デメテルの法則に違反することになります。

これについて何ができるのですか?それともLODが適用されないこの場所の1つですか?

クライアントはcharacterとは関係がないため、GetInventoryItemclientクラスに移動することは私の視点では意味がありません。

clientクラスのラッパーをすべてのxxメソッドに対して作成すると、characterクラスは過剰なようです。

どのような考えですか?この追加の間接はそれだけの価値

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]; 
} 

+1

"法の法則"は本当に "Demeterのガイドライン"です。この質問は、スタックオーバーフローにはあまりにも主観的です。なぜなら、人々がいくつかの機能を設計する方法をコーディングスタイルの問題にしているからです。あなたは、高品質のオープンソースゲームのコードベースを確認したい場合は、ドゥーム3を試してみてください。http://fabiensanglard.net/doom3/ –

+0

@DietrichEppプレーンシフトのソースは、サーバー側のカントーです。運命はクライアントだけです。 – James

+0

これは間違っています。 Doom 3のソースはクライアントだけではありません。 –

答えて

0

あなた自身を示唆しているように、あなたは完全にLODをフォローしたい場合は、あなたのような機能を必要とするだろう...か?私は、その事件、あなたの個人的な好みなどに依存しています。コメントに示されているように、LODは法律ではなくガイドラインとみなすべきです。一方、私の個人的な経験では、頻繁にそれを壊して、あなたはトラブルになるでしょう:) :)

関連する問題