2016-06-20 35 views
1

這個遊戲的源代碼是開源的,所以我決定去看看。在這裏面,我覺得是這樣的:德米特法和平移法

// 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類中爲character類看起來矯枉過正的所有xx方法創建包裝。

有什麼想法?

+1

「得墨忒耳定律」實際上是一個「得墨忒耳準則」。對Stack Overflow來說,這個問題有些過於主觀,因爲它是編碼風格的問題,人們更傾向於設計某些功能。如果您想要查看高質量的開源遊戲代碼庫,請嘗試Doom 3:http://fabiensanglard.net/doom3/ –

+0

@DietrichEpp平移源是服務器端。厄運只是客戶端。 – James

+0

這是不正確的。 Doom 3源不僅僅是客戶端。 –

回答

0

正如你建議你自己,如果你想跟着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應該被視爲一個指導方針,而不是一個真正的法律。另一方面,以我個人的經驗,經常打破它,你會陷入困境...... :)