有没有更好的可读方式来编写这个 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();
}
}
经过简单的分析,很容易理解我想实现一些简单的东西:
如果 creature
是 player
本身,则 sendCancelMessage
和 sendCancelWalk
。否则,如果 creature
是一个 monster
,它也有一个 player
的主控,则将相同的内容发送给客户端。
有没有更好的方法来编写此代码 而不用 在 Monster
、Creature
和 Player
[=37= 上添加其他方法]?
Monster
和 Player
都是 "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();
}
我有以下代码:
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();
}
}
经过简单的分析,很容易理解我想实现一些简单的东西:
如果 creature
是 player
本身,则 sendCancelMessage
和 sendCancelWalk
。否则,如果 creature
是一个 monster
,它也有一个 player
的主控,则将相同的内容发送给客户端。
有没有更好的方法来编写此代码 而不用 在 Monster
、Creature
和 Player
[=37= 上添加其他方法]?
Monster
和 Player
都是 "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();
}