0

私の質問は些細なことですが、適切な解決策が見つかりません。

コード (例):

public class ToRefact
{
    public int Func1(int i)
    {
        int a = i;
        a++;
        a++;
        a++;

        int b = FuncX2(a); //b = a * 2;

        b++;
        b++;
        b++;
        return a + b;
    }

    public int Func2(int i)
    {
        int a = i;
        a++;
        a++;
        a++;

        int b = FuncX3(a); // b = a * 3;

        b++;
        b++;
        b++;
        return a + b;
    }

    private int FuncX2(int b)
    {
        return b * 2;
    }

    private int FuncX3(int b)
    {
        return b * 3;
    }
}

func1 と func2 の本体は同じですが、コードの途中を除きます。違いは FuncX2 と FuncX3 です。しかし、このコードが途中にあるため、基本抽象クラスを実行できません。共通の抽象化を行うにはどうすればよいですか? 操作を変更しないでください (a++ を 3 回、b++ を 3 回)、順序を変更しないでください。

ありがとう

4

5 に答える 5

2

選択した言語が関数への「ポインター」を渡すことができると仮定します。

public class ToRefact
{
    private int Func(int i, Func<int, int> f)
    {
        int a = i;
        a++;
        a++;
        a++;

        int b = f(a); //b = a * 2;

        b++;
        b++;
        b++;
        return a + b;    
    }

    public int Func1(int i)
    {
        return Func(i, FuncX2);
    }

    public int Func2(int i)
    {
        return Func(i, FuncX3);
    }

    private int FuncX2(int b)
    {
        return b * 2;
    }

    private int FuncX3(int b)
    {
        return b * 3;
    }
}
于 2013-04-17T07:54:20.257 に答える
1

テンプレート メソッド(または実際のシナリオによっては戦略パターン)を使用することもできますが、この単純なケースでは、次のようにします。

public class ToRefact
{
    public int Func1(int i)
    {
        int a = FuncAdd3(i);

        int b = FuncX2(a); //b = a * 2;

        b = FuncAdd3(b);
        return a + b; // Or more compact FuncAdd3(i) + FuncAdd3(FuncX2(FuncAdd3(i)))
    }

    public int Func2(int i)
    {
        int a = FuncAdd3(i);

        int b = FuncX3(a); //b = a * 2;

        b = FuncAdd3(b);
        return a + b; // Or more compact FuncAdd3(i) + FuncAdd3(FuncX3(FuncAdd3(i)))
    }

    private int FuncAdd3(int b)
    {
        return b + 2;
    }

    private int FuncX2(int b)
    {
        return b * 2;
    }

    private int FuncX3(int b)
    {
        return b * 3;
    }
}
于 2013-04-17T08:11:59.417 に答える
0
public class ToRefact{
    public int Func1(int i){
        int a = i;
        a = addThree(a);

        int b = FuncX2(a); //b = a * 2;

        b = addThree(b);
        return a + b;
    }

    public int Func2(int i){
        int a = i;
        a = addThree(a);

        int b = FuncX3(a); // b = a * 3;

        b = addThree(b);
        return a + b;
    }

    private int FuncX2(int b){
        return b * 2;
    }

    private int FuncX3(int b){
        return b * 3;
    }

    private int addThree(int x){
        x++;
        x++;
        x++;
        return x;
    }
}
于 2013-04-17T08:05:03.977 に答える
0

基本クラスを作成し、テンプレート メソッドのデザイン パターンを適用できます。

Delphi を使用したことに注意してください。これは、メモリから記述するのが最も簡単なためですが、仮想メソッドと抽象メソッドを持つすべての言語で意図は同じです。

  TCustomRefact = class(TObject)
  protected
    function Calculate;
    function Multiply(const Value: Integer); virtual; abstract;
  end;

  TRefact1 = class(TCustomRefact )
  protected
    function Multiply(const Value: Integer); override;
  end;

  TRefact2 = class(TCustomRefact )
  protected
    function Multiply(const Value: Integer); override;
  end;
于 2013-04-17T08:05:55.010 に答える