我正在处理一个事件日志,其中有大约 60 种不同“类型”的事件。每个事件共享大约 10 个属性,然后有共享各种额外属性的事件子类别。
我如何处理这些事件确实取决于它们的类型或它们实现的分类接口。
但这似乎导致代码膨胀。我在子类方法中有很多冗余,因为它们实现了一些相同的接口。
使用具有“类型”属性的单个事件类并编写检查类型并维护类型类别的某种组织的逻辑是否更合适(例如,类别 a 的事件类型列表,类别 b 的第二个列表, ETC)?还是在这种情况下子类设计更合适?
第一种方法:
public interface Category1 {}
public interface Category2 {}
public abstract class Event {
private base properties...;
}
public class EventType1 extends Event implements Category1, Category2 {
private extra properties ...;
}
public class EventType2 extends Event implements Category3, Category4 {
private extra properties ...;
}
第二种方法:
public enum EventType {TYPE1, TYPE2, TYPE3, ...}
public class Event {
private union of all possible properties;
private EventType type;
}
我个人的看法是,似乎单个事件对象是合适的,因为,如果我正确地考虑它,就没有必要使用继承来表示模型,因为实际上只有行为和我的条件会改变基于类型。
我需要有执行以下操作的代码:
if(event instanceof Category1) {
...
}
这在第一种方法中效果很好,因为我可以只调用事件上的方法并在每个适当的子类中实现“相同的代码”,而不是 instanceof。
但是第二种方法要简洁得多。然后我写了类似的东西:
if(CATEGORY1_TYPES.contains(event.getEventType()) {
...
}
而且我所有的“处理逻辑”都可以组织成一个类,并且没有一个是冗余地分布在子类中的。那么这种情况是不是虽然 OO 看起来更合适,但最好不要呢?