1

これは低レベルの設計上の問題です。オブジェクト指向プログラミングを理解しようとしています。

値オブジェクトのデータ メンバーの値を設定するメソッドを使用して Java クラスを作成しています。これらの値は、いくつかのビジネス ロジックに従ってクラスによって計算されます。最後に、私のクラスは、入力された値オブジェクトを返すことになっています。これを行うための最もオブジェクト指向の方法は何ですか?

私が向かっていると思われる1つの可能なアプローチは、設定する必要がある(VOの)データメンバーごとにJavaクラス内にcompute()メソッドを作成することです。これらの各計算メソッドは、値オブジェクトのそれぞれのセッター メソッドを使用して設定した必要な値を返します。ただし、このアプローチはオブジェクト指向よりも手続き的であると思います。これらの計算メソッドを一連の手順で呼び出し、値オブジェクトを設定するだけだからです。

では、このコードがオブジェクト指向になるように、どのような設計 (...設計パターンか?) またはベスト プラクティスを使用/参照することができます。

代表的なコード(私が今持っているもの):

class Adapter {   // this is my Java class
    MyValueObject applyBusinessLogic(Input object)
    {
        MyValueObject vo = new MyValueObject();
        vo.setA(computeA());
        vo.setB(computeB());
        vo.setC(computeC());
        return vo;
    }

    String computeA() { ...some logic... return a;}
    String computeB() { ...some logic... return b;}
    String computeC() { ...some logic... return c;}
}

class MyValueObject {
      String a;
      String b;
      String c;

      public void setA(String a)
      {
           this.a = a;
      }

      public void setB(String b)
      {
           this.b = b;
      }

      public void setC(String c)
      {
           this.c = c;
      }
}
4

3 に答える 3

1

私見、それは本当に責任と計算方法が何をするかに依存します。オブジェクト指向の設計を行うには、SRP (http://en.wikipedia.org/wiki/Single_responsibility_principle) に留意する必要があります。また、高い凝集力と疎結合の原則。

computeA()、B、および C が関連していない場合は、Adapter クラスを分割する必要があります。それらが関連している場合は、実際の機能を表すために、アダプター クラスに別の名前を付ける必要があります。例: TaxCalculator.

次に、適用を行う TaxCalculator と MyValueObject を受け取る新しいクラスを作成できます。または、適用を計算機にそのまま残します (ただし、1 つのクラスに対して 2 つの責任が発生するため、通常は好ましくありません)。後者の場合、クラス TaxCalculationsSetter などを呼び出して、計算メソッドを非公開にすることができます。Et voila、SRP を再び満足させることができます。;-)

「責任とは何か」は、やや主観的なものであることを常に心に留めておいてください。

これで何かが明確になったことを願っています。

于 2012-12-21T12:02:39.813 に答える
1

izaera が既に述べたように、それはあなたが提供していない詳細や問題に大きく依存します。しかし、私には正しくないように見えることが少なくとも 1 つあります。

値オブジェクトの構築にはいくつかのロジックが必要なようです。問題は、どこに行くべきかということです。あなたはアダプターでそれをしました。しかし、VO の構築は Adapter ではなく VO に属するため、おそらく正しくありません。したがって、私は間違いなくそのロジックを VO 自体に移動します - その構築の一部として。

したがって、私の意見では、そのロジックを VO に移動すると、設計が改善されます。

...
MyValueObject vo = new MyValueObject(); 
vo.setA(required input);
vo.setB(required input);
vo.setC(required input);

class MyValueObject {
      String a;
      String b;
      String c;

      public void setA(required input)
      {  
          ... some logic
          this.a = result of logic
      }

      public void setB(required input)
      {  
          ... some logic
          this.b = result of logic
      }

      public void setC(Srequired input)
      {
             ... some logic
          this.c = result of logic
      }
}

明らかに、セッターを使用する必要がない限り、構築がコンストラクターで一度に行われると、全体がはるかに良くなります。たとえば、ORM などを使用している場合です。

于 2012-12-21T16:37:16.997 に答える
0

私には問題ないようです。使用するプログラミング パターンを常に探す必要はありません。最も重要なのはKISSです(愚かでシンプルにしてください)

MyValueObject を不変にできるかどうかを検討します。

class Adapter {   // this is my Java class
    MyValueObject applyBusinessLogic(Input object){
        return new MyValueObject(computeA(),computeB(),computeC());
    }

    String computeA() { ...some logic... return a;}
    String computeB() { ...some logic... return b;}
    String computeC() { ...some logic... return c;}
}

class MyValueObject {
    final String a;
    final String b;
    final String c;

    public MyValueObject(String a, String b, String c){
        this.a=a;
        this.b=b;
        this.c=c;
    }

}
于 2012-12-21T12:03:58.700 に答える