2015-06-27 49 views
0

我有以下代碼:有沒有更好的可讀方式來寫這個if語句鏈?

Creature::cancelWalk() 
{ 
    Player* player = getPlayer(); 

    if (!player) { 
     if (getMonster() && getMonster()->getMaster() && getMonster()->getMaster()->getPlayer()) { 
      player = getMonster()->getMaster()->getPlayer(); 
     } 
    } 

    if (player) { 
     player->sendCancelMessage(ret); 
     player->sendCancelWalk(); 
    } 
} 

經過短暫的分析,很容易理解我想要實現的東西很簡單:

如果creatureplayer本身,然後sendCancelMessagesendCancelWalk。否則,如果creature是一個monster也有一個主人是player,發送相同的東西到客戶端。

有沒有更好的方式來寫這個代碼沒有MonsterCreaturePlayer類添加其他方法?

MonsterPlayer都是來自Creature的「兄弟姐妹」。

+0

假定爲'getMonster()連續調用 - > getMaster () - > getPlayer()'不能返回不同的值,你不必在'if'語句中檢查它的值。 –

+0

看起來像http://codereview.stackexchange.com的問題。 – DanielKO

回答

0

假設各種功能對多個呼叫沒有不同的影響,請嘗試引入一些臨時對象。

Player* player = getPlayer(); 

if (!player) 
{ 
    Monster monster = getMonster(); 
    if (monster) 
    { 
     Master *master = monster->getMaster(); 
     if (master) player = master->getPlayer()) { 
    } 
} 

if (player) { 
    player->sendCancelMessage(ret); 
    player->sendCancelWalk(); 
} 

除此之外,你可能想要更仔細地看看你的設計。如果你有很多嵌套指針需要在解引用之前依次檢查NULL,那麼可能需要指定和強制指針不爲NULL的不變量(這意味着只有構造父對象時,如果所有組件部分都可以創建,構造對象如果只能部分構造)。

例如,如果我們假設getMonster()返回非空這就保證了getMaster()getPlayer()也不會返回NULL ....

Player* player = getPlayer(); 

if (!player) 
{ 
    player = getMonster()->getMaster()->getPlayer()); 
} 

if (player) 
{ 
    player->sendCancelMessage(ret); 
    player->sendCancelWalk(); 
} 
+0

你假定非NULL getMonster()意味着非NULL getMaster()和getPlayer(),但是你的代碼不會對getMonster()進行空檢查。此外,在問題中指出,一個怪物可能沒有任何主人,並且這個主人可能不是一個玩家。 – pkubik

+0

你錯過了我的觀點,pkubik,這是重新設計,以避免需要NULL檢查。我會調整這些單詞來拼出來。 – Peter

相關問題