問題
私は大きなクラス(約1500 LOC)を持っており、さまざまな「戦略」を使用して、あるオブジェクトから別のオブジェクトにデータを変換します。私はここにそのクラスの表現を持っています:
public class FooService implements FooProcessing {
FooRequestTransformer fooRequestTransformer;
AnotherService anotherService;
InstanceVar1 iVar1;
InstanceVar2 iVar2;
...
このクラスが使用するインターフェース(クラスの外部)があります:
interface TransformerStrategy {
public FooRequest transform(FooResponse response);
}
これは(FooServiceクラス内の)このメソッドに渡されます:
private FooResponse getResponse(FooResponse fooResponse, TransformerStrategy transformerStrategy) {
FooRequest fooRequest = transformerStrategy.transform();
fooResponse = anotherService.bar(fooRequest);
return fooResponse;
}
getResponse()
メソッドを使用してTransformerStrategy
匿名で作成するエントリポイントは次のとおりです。
public List<Foo> getFooForSomeFlow1(Param1 param1, Param2 param2, ...){
FooResponse fooResponse = anotherService.baz(fooRequest);
TransformerStrategy myTransformerStrategy = new TransformerStrategy() {
public FooRequest transform(FooResponse fooResponse) {
fooRequestTransformer.transform(param1, param2, iVar1, iVar2)
}
}
FooResponse fooResponse = getResponse(fooResponse, myTransformerStrategy);
...//other code
}
ここで問題となるのは、(inside )のようないくつかのメソッドがあり、それらはすべて独自の匿名実装を持ち、その後にを呼び出します。ご想像のとおり、これは非常に厄介であり、デバッグ時に混乱します(つまり、ステップインした後、突然戻ってきます)getFooForSomeFlow1()
FooService
TransformerStrategy
getResponse()
getResponse()
getFooForSomeFlow1()
考えられる解決策
考えられる解決策の1つ(頭に浮かぶ)は、これらのさまざまな戦略を「プロバイダー」クラスに編成して、何らかの方法でそれらをグループ化することです。不思議なことに、このクラスにはすでにこのタイプのプロバイダークラスが含まれています。
protected class StrategyProvider {
public ABCTransformerStrategy newABCTransformerStrategy(FooRequestTransformer transformer, Param1 param1, Param2 param2) {
return new ABCTransformerStrategy(transformer, param1, param2);
}
}
protected class ABCTransformerStategy implements TransformerStrategy {
protected FooRequestTransformer transformer;
protected Param1 param1;
protected Param2 param2;
//...constructor here
//...overridden transform method as above
}
コメントの1つには、「テスト目的で匿名クラスを内部クラスに変換した」と書かれています。しかし、彼らはそのうちの1つだけを変換し、残りを残しました。つまり、彼らがリファクタリングのプロセスを開始し、途中で停止したようなものです。
そのため、リファクタリングのプロセスを終了して、すべての匿名クラスを内部クラスに移動し、最終的にこれらのクラスStrategyProvider
を外部クラスに移動できると考えていました。問題は、「匿名から内部への変換」によって定型文が追加され(ABCTransformerStrategy
上記を参照、すべてのデータをコンストラクターに渡す必要がある)、このリファクタリングプロセスを実行することでどれだけの利益が得られるかがよくわからないことです。
2つの質問があります:
- このアプローチを続行する必要がありますか?
- または、このコードをより適切で単純化する、適用できる別のデザインパターンはありますか?
ありがとう