是否有更好的可读方式来编写这个if语句链?

时间:2015-06-27 23:35:21

标签: c++11 readability code-readability

我有以下代码:

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。否则,如果creaturemonster且还有一个player的主人,请将相同的内容发送给客户。

有没有更好的方法来编写此代码而不MonsterCreaturePlayer类上添加其他方法?

MonsterPlayer都是来自Creature的“兄弟姐妹”。

1 个答案:

答案 0 :(得分: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()返回非NULL,这保证getMaster()getPlayer()也不返回NULL ....

Player* player = getPlayer();

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

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