【问题标题】:Is there a better readable way to write this if statement chain?有没有更好的可读方式来编写这个 if 语句链?
【发布时间】:2015-06-27 23:35:20
【问题描述】:

我有以下代码:

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 的“兄弟姐妹”。

【问题讨论】:

  • 假设连续调用getMonster()->getMaster()->getPlayer()不能返回不同的值,你不必在if语句中检查它的值。
  • 看起来像codereview.stackexchange.com 的问题。

标签: c++11 readability code-readability


【解决方案1】:

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

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();
}

【讨论】:

  • 您假设非 NULL getMonster() 意味着非 NULL getMaster() 和 getPlayer(),但您的代码不会对 getMonster() 进行空检查。此外,问题中明确指出怪物可能没有任何主人,并且该主人可能不是玩家。
  • 你错过了我的意思,pkubik,即重新设计以避免需要 NULL 检查。我会调整单词来拼写出来。
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多