1

次のパターンでコードをリファクタリングしようとしています。

// from
object1.foo(object2).bar() ;

// to
fooBar(object1, object2) ;

どこ

  • object1 は SuperClass のサブタイプです
  • object2 は文字列です
  • fooBar は、インポートする必要があるユーティリティ クラスにあります

文脈上、この変更は、場合によっては foo() が null を返すためであり、bar() が呼び出されたときに NullPointerExceptions が発生します。
fooBar() は最初に foo() によって null が返されるかどうかをチェックし、そうであればデフォルト値を返し、そうでなければ bar() を呼び出してそれを返します。

私はEclipseを使用していますが、ファイル検索などで正規表現を使用してすべての出現を手動で変更する代わりに、これを行う良い方法があるかどうか疑問に思っています.

編集 - コメントに応じた詳細情報:

foo() の実装を制御することはできません。

object1 が SuperClass のサブクラスであることについて:

//in some cases this happens
SuperClass object1 = new SuperClass(/*whatever*/) ;

//in other cases this happens
ChildClass object1 = new ChildClass (/*whatever*/) ;

object1 の検索方法に影響する可能性があるため、言及する必要があります。

[多分]前後のコードのより明確なバージョン:

//before
Object result = object1.foo("a string").bar() ;
//NullPointerException if foo() returns null! :(

//after
Object result = fooBar(object1, "a string") ;

一方、別のユーティリティ クラスには、次のものがあります。

public static Object fooBar(SuperClass obj, String str) {
    Object result = DEFAULT_RESULT ;

    if (obj != null && str != null && obj.fooAble(str)) {
        result = obj.foo(str).bar() ;
    }

    return result ;
}
4

1 に答える 1

0

この3年間の人生を費やしても解決策を見つけました!:)

実際には、あるメソッド呼び出しを別のメソッド呼び出しに置き換えるコード リファクタリングに基づくソリューションです。例: 前に:obj1.method1(){}; obj2.method2(obj1){ obj1.method1(); };

Eclipse リファクタリング「インライン ...」を適用すると、すべての呼び出しが呼び出しにobj2.method2(obj1);置き換えられますobj1.method1();

だからあなたの場合:

  1. メソッド foo、bar、fooBar の実装を使用して、ソース ファイルのバックアップ コピーを作成します。
  2. 次に、fooBar の実装を次のように置き換えます。 fooBar(object1, object2) { return this; };
  3. メソッド bar() の実装を次のように置き換えます。 bar() { return this; };
  4. メソッド foo(object2) の実装を次のように置き換えます。 foo(object2) { return fooBar(this,object2); };
  5. 次に、bar() Eclipse リファクタリング「インライン ...」の任意の呼び出しに適用します。すべての bar() 呼び出しが解消されます。
  6. そのようなすべての呼び出しobject1.foo(object2)fooBar(this,object2);
  7. バックアップ コピーから各メソッドの実装を復元します。

それでおしまい!

于 2016-08-10T19:40:32.813 に答える