不久前我正在研究problem,责任主题和应该去的地方出现了。在我的链接问题中,大学是持有所有规则并确保每个学生注册的机构和班级,具有所需的文件。
这让我想起了Eric Lippert撰写的一篇博文:Wizards and Warriors。
它写道:
我们继续谈论“规则”,因此显然该程序的业务领域包括称为“规则”的东西,并且这些规则与业务领域中的所有其他对象进行交互。那么那么“统治”应该是一个阶级吗?我不明白为什么不!这是该计划的基本内容。似乎可能存在数百或数千个这些规则,并且它们可能随着时间而改变,因此将它们编码为类似乎是合理的。
规则:
我的问题是如何在GameRules
class
中确定传递的具体对象以验证我是否可以携带它?
public final class GameRules {
public static boolean verifyifwizardcancarry(Weapon weapon){
boolean canCarry = false
if weapon is a a staff set canCarry to true
return canCarry;
}
}
public abstract class Player{
private List<Weapon> weapons;
// constructor and OOP goodness left out
public abstract void add(Weapon weapon);
}
public final class Wizard extends Player{
@Override
public void add(Weapon weapon){
if(GameRules.verifyifwizardcancarry(weapon){
// - code to add weapon to inventory
}
}
}
如何验证传递给Weapon
GameRules
的class
实际上是Sword
?从阅读,使用instanceof
或getClass()
被认为是代码气味。
我找到了this的答案,但是它违反了LSP,违背了博客所说的,它不应该抛出异常,并没有真正回答我的问题。
按照这个Java dynamic binding and method overriding
当添加一个Sword时,可以调用这样的函数,而不是武器的任何其他子元素
public void add(Sword sword){
//nope
}
如果只能配备一个(或几个)武器,也可以这样做,但是Overriden功能会给出否定响应。
在你的情况下,我认为你不能避免使用instanceof
算子。我建议你自己制作每个具体的Player
,负责确定它能携带什么武器。因此,移除GameRules.verifyifwizardcancarry
并在玩家之间传播这种逻辑,以便Wizard
对instanceof
进行武器检查,其他玩家也这样做。