这种“实例”运算符的使用是否被视为不良设计?
2022-09-01 10:56:22
在我的一个项目中,我有两个“数据传输对象”RecordType1 和 RecordType2,它们继承自一个抽象的 RecordType 类。
我希望两个 RecordType 对象都由同一个 RecordProcessor 类在“process”方法中处理。我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示:
public RecordType process(RecordType record){
if (record instanceof RecordType1)
return process((RecordType1) record);
else if (record instanceof RecordType2)
return process((RecordType2) record);
throw new IllegalArgumentException(record);
}
public RecordType1 process(RecordType1 record){
// Specific processing for Record Type 1
}
public RecordType2 process(RecordType2 record){
// Specific processing for Record Type 2
}
我读过斯科特·迈耶斯(Scott Meyers)在《有效C++》中写道:
“每当你发现自己在写代码时,'如果对象是T1类型,那就做点什么,但如果它是T2类型,那就做点别的事情,'打自己一巴掌。
如果他是对的,显然我应该打自己一巴掌。我真的不明白这是糟糕的设计(当然,除非有人子类化RecordType并添加RecordType3,而不向处理它的通用“Process”方法添加另一行,从而创建NPE),并且我能想到的替代方案涉及将特定处理逻辑的首当其冲放在RecordType类本身中, 这对我来说真的没有多大意义,因为理论上可以有许多不同类型的处理,我想对这些记录执行。
有人可以解释为什么这可能被认为是糟糕的设计,并提供某种替代方案,仍然将处理这些记录的责任交给“处理”类?
更新:
- 更改为
return null
throw new IllegalArgumentException(record);
- 只是为了澄清,一个简单的RecordType.process()方法是不够的有三个原因:首先,处理确实与RecordType相去甚远,不值得在RecordType子类中拥有自己的方法。此外,理论上可以由不同的处理器执行大量不同类型的处理。最后,RecordType 被设计为一个简单的 DTO 类,其中包含最少的状态更改方法。