作为JAVA继承的学习进程,我将调度器类和actor类放在一起。调度程序类创建一个actor对象列表并通过它们进行调用,调用actor来执行act()。
现在我对actor类的第一直觉是向玩家actor传递对Scheduler的引用,以便玩家可以在他/她的回合到达时暂停调度程序。
所以在调度程序中,我有一个对当前actor的引用,可以执行以下操作。
actor.act( this );
这是调度程序。
现在在玩家类中我可以声明行为如下......
@Override
public int act( Scheduler queue )
{
//need to pause scheduler here and wait for player to act
queue.lock();
//wait for action from player
if (this.playerActionComplete)
{
queue.unlock();
}
}
这是正确的OOP方法吗?我已经发生了奇怪的事情,并想知道我是否应该坚持这种方法。
干杯!
答案 0 :(得分:2)
由于三个主要原因,你不应该坚持这种方法:
1)循环依赖。将this
作为参数传递是典型的代码气味。
2)单一责任。演员应该行动,玩家应该玩,调度员应该安排。不要让演员控制调度程序。如果其中一个演员忘记将Scheduler.unlock置于try finally块中怎么办?如果您想引入另一种具有完全不同的处理方式的调度程序,该怎么办?
3)不要重复自己/紧耦合。我假设调度程序可以使用不同类型的角色?如果是这样,他们是否都会包含相同的代码来锁定和解锁调度程序?或者它们都需要从同一个抽象基类继承吗?如果是这样,你就不会重复自己,而是将你的演员紧密地耦合到你的调度程序,这使得演员无法在没有调度程序的情况下工作。
为什么不让调度程序调用锁定并解除对act的调用?