私のプロジェクトの 1 つに、RecordType の抽象クラスから継承する 2 つの「データ転送オブジェクト」RecordType1 と RecordType2 があります。
「プロセス」メソッド内で、両方の RecordType オブジェクトを同じ RecordProcessor クラスで処理したいと考えています。私が最初に考えたのは、次のように 2 つの特定のプロセス メソッドに委譲する汎用プロセス メソッドを作成することでした。
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」メソッドに別の行を追加せずに RecordType3 を追加して、NPE を作成しない限り)、および私が考えることができる代替案特定の処理ロジックを RecordType クラス自体の中に置く必要がありますが、理論的にはこれらのレコードに対して実行したいさまざまな種類の処理が存在する可能性があるため、これはあまり意味がありません。
これが悪い設計と見なされる理由を誰かが説明し、これらのレコードを処理する責任を「処理」クラスに与える何らかの代替手段を提供できますか?
アップデート:
return null
に変更throw new IllegalArgumentException(record);
- 簡単に説明すると、単純な RecordType.process() メソッドでは不十分な理由が 3 つあります。まず、処理が RecordType から離れすぎているため、RecordType サブクラスで独自のメソッドを作成する価値がありません。また、理論的にはさまざまなプロセッサで実行できるさまざまな種類の処理が多数あります。最後に、RecordType は、最小限の状態変更メソッドが定義された単純な DTO クラスになるように設計されています。