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

Is there a better readable way to write this if statement chain?

我有以下代码:

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 [=37= 上添加其他方法]?

MonsterPlayer 都是 "siblings" 派生自 Creature.

假设各种函数对多次调用没有不同的影响,尝试引入一些临时对象。

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

Player* player = getPlayer();

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

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