我有以下代码:
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
类上添加其他方法?
Monster
和Player
都是来自Creature
的“兄弟姐妹”。
答案 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();
}