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,即重新设计以避免空检查的需要。我会把这些单词拼出来。