C++11 是否有更好的可读性方法来编写这个if语句链?

C++11 是否有更好的可读性方法来编写这个if语句链?,c++11,readability,code-readability,C++11,Readability,Code Readability,我有以下代码: Creature::cancelWalk() { Player* player = getPlayer(); if (!player) { if (getMonster() && getMonster()->getMaster() && getMonster()->getMaster()->getPlayer()) { player = getMonster()->g

我有以下代码:

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();
    }
}
经过简单的分析,很容易理解我想要实现一些简单的目标:

如果
生物
玩家
本身,则
发送取消消息
发送取消行走
。否则,如果
生物
是一个
怪物
,它的主人也是
玩家
,则将相同的东西发送给客户

是否有更好的方法编写此代码而不在
怪物
生物
玩家
类上添加其他方法


怪物
玩家
都是源于
生物
的“兄弟姐妹”

假设各种功能对多次调用没有不同的影响,请尝试引入一些临时属性

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()
返回非NULL,这保证
getMaster()
getPlayer()
也不会返回NULL

Player* player = getPlayer();

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

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

假设对
getMonster()->getMaster()->getPlayer()
的连续调用不能返回不同的值,则不必在
if
语句中检查其值。看起来像是一个问题。假设非空getMonster()意味着非空getMaster()和getPlayer()但是您的代码不会对getMonster()执行空检查。此外,问题中还明确指出,怪物可能没有任何主人,而主人也可能不是玩家。你没有理解我的观点,pkubik,即重新设计以避免空检查的需要。我会把这些单词拼出来。