私は、約 60 の異なる「タイプ」のイベントがあるイベントのログを扱っています。各イベントは約 10 個のプロパティを共有し、さまざまな追加プロパティを共有するイベントのサブカテゴリがあります。
これらのイベントをどのように処理するかは、イベントの種類または実装するカテゴリ インターフェイスによって異なります。
しかし、コードの肥大化につながっているようです。サブクラス メソッドは同じインターフェイスをいくつか実装しているため、サブクラス メソッドには多くの冗長性があります。
「タイプ」プロパティを持つ単一のイベント クラスを使用し、タイプをチェックしてタイプのカテゴリの編成を維持するロジックを記述する方が適切ですか (たとえば、カテゴリ a のイベント タイプのリスト、カテゴリ b の 2 番目のリスト、等)?それとも、この場合、サブクラスの設計の方が適切ですか?
最初のアプローチ:
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 ...;
}
2 番目のアプローチ:
public enum EventType {TYPE1, TYPE2, TYPE3, ...}
public class Event {
private union of all possible properties;
private EventType type;
}
私の個人的な意見では、単一のイベント オブジェクトが適切であると思われます。なぜなら、私が正しく考えている場合、継承を使用してモデルを表現する必要はないからです。なぜなら、変更されるのは実際には動作と私の条件だけだからです。タイプに基づいています。
次のようなコードが必要です。
if(event instanceof Category1) {
...
}
これは、instanceof の代わりにイベントでメソッドを呼び出して、適切なサブクラスのそれぞれに「同じコード」を実装できるという点で、最初のアプローチでうまく機能します。
しかし、2 番目のアプローチははるかに簡潔です。次に、次のようなものを書きます。
if(CATEGORY1_TYPES.contains(event.getEventType()) {
...
}
また、すべての「処理ロジック」は単一のクラスに編成でき、サブクラス間で冗長に分散されることはありません。では、これは OO の方が適切に見えますが、そうでないほうがよいというケースですか?