2

まったく同じ構造を持つが、内部で呼び出すメソッドが異なる 2 つのメソッドがあるとします。「構造」とは、論理演算子、コールバック、または内部クラスの同じスキームを意味します。つまり、実行の流れを定義するすべてのものです。いくつかの使用例が考えられます:

1) どちらのメソッドも似ていますが、内部呼び出し (methodA と methodB) が異なります。

void callIt(int a, int b) {

if (..) {
  methodA();
}

}

void callIt(int a, int b) {

if (..) {
  methodB();
}

}

2) メソッドは似ていますが、内部呼び出しパラメーターのパラメーターが異なります (つまり、メソッド間の唯一の違いは、 (methodA) 内のいくつかの呼び出しのオーバーロードです)。

void callIt(int a, int b) {

if (..) {
  methodA(a, b);
}

}

void callIt(String a, String) {

if (..) {
  methodA(a, b);
}

} 

このコードを単純化し、コードの繰り返しを避けることは可能ですか?

PS私はJavaを使用していますが、それが問題にならないことを願っています.

回答: ピート ベルフォードが答えてくれました。私が彼に正しければ、ここでさらに詳しく説明します:同じコードを使用するが異なるタイプのメソッドをリファクタリングする

4

2 に答える 2

1

ここで探しているのは依存性注入だと思います。

A と B の 2 つのクラスがあるとします。

public interface Handler {
  myHandler(int a, int b);
}

public class AHandler implements Handler {....}

public class BHandler implements Handler {....}

次に、いくつかの基準に基づいて、正しいハンドラーを呼び出し元のコードに挿入します...

public class MyCaller {
    private Handler handler;  //have a setter.

    public void callIt(int a, int b) {
        handler.myHandler(a, b);
    }
}

明らかに、Spring フレームワークを使用して構成を通じてこの注入を行うことができますが、独自にコーディングすることもできます。

2 番目の部分は、オーバーロードのオブジェクト指向の概念で簡単に実現できます。インターフェイスには次のものがあります。

myHandler(int a, int b);
myHandler(String a, String b);

貧弱な入力変数名にも関わらず、これは多くの一般的な API メソッドが動作する方法です。たとえば、StringBuilder の append メソッドには、入力パラメーターのみが異なるさまざまなバージョンがあります。

于 2013-08-23T13:43:35.103 に答える
0

最初のケースは、メソッド名を String パラメーターとして渡し、リフレクションを使用して呼び出すことで一般化できます。

Java は値の動的キャストが得意ではないため、2 番目のケースははるかに困難です。

リフレクションにより、コードの読み取り/保守が非常に難しくなる可能性があることに注意してください。

于 2013-08-23T13:48:31.807 に答える