8

私のDAOには、2つの異なるオブジェクトを構築するメソッドがあり、それらの両方のオブジェクトを返したいのですが、それを行う最善の方法がわかりません。を使用して? extends myObject、返したいオブジェクトの両方を保持する別のクラスを作成し、List<Object>.

これらの同様のオブジェクトが必要な理由についての簡単な話は、1つを画面に表示し、もう1つを私が知る限りオブジェクト内のリストを処理しないprimefaces dataexporterで使用することです。

クラスの人

public class Person() {
  firstName = null;
  lastName = null;
  List<Programs> programs = new ArrayList<Programs>();

  // Getters and setters
}

クラス DataExporterPerson

public class DataExporterPerson() {
  firstName = null;
  lastName = null;
  String program = null;

  // Getters and setters
}

DAO メソッド:

public List<SOMETHING> getPeople() {
  // query db for people

  // build both objects

  return ?????
}

以下のような別のオブジェクトを非常に簡単に作成できることを理解しましたが、基本的に1つのメソッドから戻るためだけにオブジェクトを作成しているため、それは非効率的な方法のようです。

public class PersonTransporter() {
  Person person = null;
  DataExporterPerson = null;
}

このシナリオを処理する最善の方法は何ですか?

編集

1 つのメソッドで 2 つのオブジェクトを返そうとしているのは、これがデータベースにクエリを実行し、クエリのデータに基づいて 2 つのオブジェクトを構築する DAO メソッドであるためです。必要がなければ db を 2 回クエリしたくないので、2 つのメソッドに分割したくありません。

4

4 に答える 4

5

メソッドが 2 つの異なる型を返す必要がある場合、これはアーキテクチャまたはメソッド ロジックに問題があることを示しています。

あなたは何ができますか?

  • 要素を論理的に結合するクラスを作成し、
  • 両方のクラスが実装する共通のインターフェースを導入し、
  • 2 つのメソッドを実装し、最初にオブジェクトを返します。2 番目はパラメーターを使用し、2 番目のオブジェクトを返します。

最後のポイントの例

 class Foo {
    String f;
 } 

 class Bar {
   String b;
 }

次に、オブジェクト Foo と Bar を返す方法の問題はありますか?

 public Object theProblemMethod() {

      Foo a = new Foo();
          a.foo = "Test";

      Bar b = new Bar();
          b.bar = a.foo;   //The logic where class Foo meet class Bar.

    return ???

 }

有効な実装

   public Foo createFoo(){ 
      Foo a = new Foo();
          a.foo = "Test";
      return a;
   } 

   public Bar createBar(Foo f) {

      Bar b = new Bar();
          b.bar = f.foo; 
      reutrn b;
   }

使用法

   public void action()  {

           //theProblemMethod(); //This we can not do

          Foo a = createFoo();
          Bar b = createBar(a);
  }
于 2013-08-09T16:45:24.073 に答える
2

ここでの実際の問題は、デザインの 1 つです。メソッドは複数のことを行うべきではありません。したがって、2 つの異なるオブジェクトを返すメソッドは、おそらく悪い設計です。この問題を実際に解決するには、メソッドを 2 つの別々のメソッドに分割して、2 つの異なる問題を処理する必要があります。

ただし、これができないと仮定しましょう。あなたのメモに基づいて、2 つのオブジェクトの状態のほとんどが繰り返されているようです。これら2つを同様のソースから継承させることで組み合わせることができますが、これは問題の半分しか解決しません. 代わりに、一方を他方で装飾できます。

public class DataExporterPerson {
  private Person person;
  private String program = null; //or any other

  //other getters/setters, esp to get the core 'person' object.
  //note that getters/setters for repeated state should just
  //  pass through to the underlying object:
  public String getName() { person.getName(); } //for example
}

絶対に 2 つのオブジェクトを返す必要がある場合は、これを行うこともできますが、テストが難しく、「副作用なし」の原則に違反しています。

public boolean buildThings(ThingA a, ThingB b) {
  a = <whatever>;
  b = <whatever else>;

  return true;//success!
}

//...
//somewhere else in code
ThingA a = null;
ThingB b = null;
boolean result = buildThings(a, b);
//use a and b here
于 2013-08-09T16:52:39.840 に答える