在我的一个项目中,我有两个“数据传输对象”RecordType1和RecordType2,它们都继承自RecordType的抽象类。
我希望两个RecordType对象都能在同一个RecordProcessor类中由“process”方法处理。我的第一想法是创建一个通用的process方法,将其委托给两个特定的process方法,如下所示:
“每当你发现自己编写形如‘如果对象是类型 T1,那么做某事,但如果它是类型 T2,则做其他事情’的代码时,你就应该扇自己一个耳光。”
如果他是正确的,显然我应该扇自己一个耳光。 我真的不明白为什么这是不好的设计(除非当然有人对 RecordType 进行子类化并添加一个 RecordType3 而没有在处理它的通用“Process”方法中添加另一行,从而创建 NPE),而我能想到的替代方案涉及将特定处理逻辑的重点放在 RecordType 类本身中,这对我来说真的没有太多意义,因为理论上可以对这些记录执行许多不同类型的处理。
可以有人解释为什么这可能被认为是不良设计,并提供一些替代方案,仍然将处理这些记录的责任交给“Processing”类吗?
更新:
- 将 return null 更改为 throw new IllegalArgumentException(record); - 仅澄清一下,简单的 RecordType.process() 方法无法满足三个原因:首先,处理与 RecordType 相距甚远,不值得在 RecordType 子类中拥有自己的方法。 其次,有各种不同类型的处理器可以在理论上执行不同的处理。 最后, RecordType 被设计为一个简单的 DTO 类,其中仅定义了最小限度的状态更改方法。
我希望两个RecordType对象都能在同一个RecordProcessor类中由“process”方法处理。我的第一想法是创建一个通用的process方法,将其委托给两个特定的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 在《Effective C++》中写的以下内容:“每当你发现自己编写形如‘如果对象是类型 T1,那么做某事,但如果它是类型 T2,则做其他事情’的代码时,你就应该扇自己一个耳光。”
如果他是正确的,显然我应该扇自己一个耳光。 我真的不明白为什么这是不好的设计(除非当然有人对 RecordType 进行子类化并添加一个 RecordType3 而没有在处理它的通用“Process”方法中添加另一行,从而创建 NPE),而我能想到的替代方案涉及将特定处理逻辑的重点放在 RecordType 类本身中,这对我来说真的没有太多意义,因为理论上可以对这些记录执行许多不同类型的处理。
可以有人解释为什么这可能被认为是不良设计,并提供一些替代方案,仍然将处理这些记录的责任交给“Processing”类吗?
更新:
- 将 return null 更改为 throw new IllegalArgumentException(record); - 仅澄清一下,简单的 RecordType.process() 方法无法满足三个原因:首先,处理与 RecordType 相距甚远,不值得在 RecordType 子类中拥有自己的方法。 其次,有各种不同类型的处理器可以在理论上执行不同的处理。 最后, RecordType 被设计为一个简单的 DTO 类,其中仅定义了最小限度的状态更改方法。
if (a instanceof X)
逻辑表达式,那么您真的需要自我反省。 - Anthony Pegram