2017-08-16 19 views
1

私は巨大なPartソースコードを持っている1つの場所で触れる必要があります。多くの原則に違反しているので、少なくとも修正しなければならなかった関数、つまり@UIEventTopicハンドラを抽出したいと思います。テストはありません。ここに追加したいので、既存の機能を破らないことがわかります。Eclipse RCPでパートからリスニングするUIイベントを分離する:正しく行う方法は?

私はこのから離れて移動したいと思います。このような何かに

public class MyPart { 
    ... 

    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam p) { 
    ... 
    } 
} 

:EclipseのDIで

public class MyPart { 
    ... 
} 

public class MyEventHandler { 
    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam p, MyPart part) { 
    ... 
    } 
} 

私は、ハンドラクラスのインスタンスを作成するための簡単な方法を参照してくださいません。複数のインスタンスを持つことができる Partであり、 @PostConstructIEclipseContextにハンドラを追加すると、パーツとハンドラの間に循環依存関係が追加されるため、醜いです。 @Singletonにすることはできません。 e4xmiファイルやその他の方法でインスタンス化を実行する方法はありますか?

私の現在の解決策は、純粋にユーティリティーBeanに機能を抽出し、データを返して部品に設定することですが、これもあまり良くありません(追加のヌルチェックやifsなどが必要です)。 )。私はあなたの質問を理解していることを全くわからない

答えて

1

は、しかし、これは私が進行する方法です:

抽出委任

がようMyClass完全に委譲しMyEventHandlerevent()にコードを移動しますイベント処理

public class MyPart { 
    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam param) { 
    new MyEventHandler().handleEvent(this, param); 
    } 
} 

class MyEventHandler { 
    void handleEvent(MyPart part, EventParam param) { 
    // all code from event() goes here 
    } 
} 

これはテストをしなくても安全なリファクタリングでなければなりません。最終的には、havテストがないので選択肢がありません。

は、今私はMyPartの必要なメソッドをあざける、handleEvent()のためのテストを書くので、私は既存の動作を壊さないであろうことを確認してしまう現状を確認してください。

は、私がテスト駆動方法でMyEventHandler::handleEventに必要な変更を加えることができるだろうその後新しい機能

を実装します。

クリーンアップ

それから私はその仕事をするためにMyEventHandlerために必要なメソッドのみを持っているMyPartからインターフェイスを抽出します。上記のインタフェースが大きすぎると、余分なリファクタリングが残っていることを示します。

+0

こんにちはルディガー、うん、たくさんのthx。結局、私たちは同様の状況に陥りました。模倣はテストを少し膨らませてしまったので、その部分を渡すことを期待しています。だから私たちはむしろ結果オブジェクトを作成し、それをテストしています。洞察のためのThx。 – rlegendi

関連する問題