2011-01-26 10 views
0

にクラスAからデータをコピーするには、次の場合を考えてみます。OO設計:念頭に置いSOLID原則とテスト容易性を持つB

あなたは、クラスAと一部重複の性質を持っているクラスBを持っています。共通のプロパティをクラスAからクラスBにコピーおよび/または変換するメソッドが必要です。そのメソッドはどこに行きますか?

  1. クラスAをBとしてGetAsB()?
  2. コンストラクタB(A入力)としてのクラスB?
  3. メソッドとしてのクラスB void FillWithDataFrom(A input)?
  4. 静的メソッドとしてのクラスC ConvertAtoB(Aソース)?
  5. ???
+0

これはおそらくプログラマーの方が良いでしょう。 – beetstra

答えて

1

異なる状況ではすべて意味があります。 Javaからいくつかの例:あなたが決めるのに役立つ

  1. String java.lang.StringBuilder.toString()
  2. java.lang.StringBuilder(String source)
  3. void java.util.GregorianCalender.setTime(Date time)
  4. ArrayList<T> java.util.Collections.list(Enumeration<T> e)

いくつかの質問:依存MAK

  • もっと意味がある? AはBに依存し、BはAに依存しないか?
  • あなたはいつもAから新しいBを作成しますか、またはAsを使用して既存のBsを満たす必要がありますか?
  • BsのデータプロバイダまたはAsデータのターゲットのいずれかと同様のコラボレーションを持つ他のクラスはありますか?
+0

4つの戦略すべてが.Javaフレームワークに適用されていることは非常に興味深いことです。 .NETには非常によく似たパターンがありますが、私はなぜそれが一方的に実装されているのか、それとも他の方法で実装されているのかを考えていないだけです。あなたの質問も非常に有用です、ありがとう。 – Nilzor

1

getterメソッドは避けるべきであるから(は教えてください、原則を頼んではいけません)。

変換のように見えるので、私は除外します。これは、AとBが何か共通のことが起こっている異なるクラスである場合、変換ではありません。少なくとも、これは説明からのものです。それが事実でない場合、2もオプションになります。

4.はCがBおよび/またはCの内部の詳細を認識していることを意味しますか?もしそうなら、私はこのオプションも除外します。

私は3に投票します。

+0

はい、4はCがAとBの両方の内部の詳細を認識していることを意味します。思考のために食べ物をくれた。 – Nilzor

0

OOP理論が正しいかどうかは議論の対象となりますが、状況によってはCを非常に早く排除することはしません。 tiはかなり大きな依存関係を作成しますが、Cの特定の役割がAからBへの相互作用(およびコピー)を管理することであれば、それを使うことができます。依存関係は、AとBの間の依存関係を避けるためにさらに、Cは依存関係を管理するために特別に存在し、そのことを念頭に置いて実装することができます。

Ex。 (vb.Net/Pseudocodeで):

、たとえば、AtoBConverterClassを作成するための具体的な理由がある場合
Public Class C 
    Public Shared Function BClassFactory(ByVal MyA As A) As B 
     Dim NewB As New B 
     With B 
      .CommonProperty1 = A.CommonProperty1 
      .CommonProperty2 = A.CommonProperty2 
     End With 
     Return B 
    End Function 
End Class 

、このアプローチは有効かもしれません。

また、これは特殊なケースです。しかし、私はそれを機会に役立つと感じました。特に、AとBがお互いに無知であることを本当に重要な理由があるならば。

関連する問題