0

SOLID の原則とテスト可能性を念頭に置いて、次のケースを検討してください。

重複するプロパティを持つクラス A とクラス B があります。共通プロパティをクラス A からクラス B にコピーおよび/または変換するメソッドが必要です。そのメソッドはどこに行くのでしょうか?

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

3 に答える 3

1

1.ゲッターメソッドは避けるべきなので除外します(教えて、原則を尋ねないでください)。

2. は変換のように見えるため、除外します。これは、A と B がたまたま何か共通点を持つ異なるクラスである場合、変換ではありません。少なくとも、これは説明から見えるものです。そうでない場合は、2も選択肢になります。

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

私は 3 に投票します。

于 2011-01-26T11:31:22.763 に答える
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)

決定に役立ついくつかの質問:

  • どちらの依存関係がより理にかなっていますか? A は B に依存し、B は A に依存し、どちらでもない?
  • A から常に新しい B を作成しますか、それとも As を使用して既存の B を埋める必要がありますか?
  • Bs のデータ プロバイダーとして、または As データのターゲットとして、同様のコラボレーションを持つ他のクラスはありますか?
于 2011-01-26T11:54:47.287 に答える
0

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

元。(vb.Net/Pseudocode):

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

AtoBConverterClass などを作成する具体的な理由がある場合、このアプローチは有効である可能性があります。

繰り返しますが、これは特殊なケースかもしれません。しかし、私は時々それが役立つことを発見しました。特に、A と B がお互いのことを知らないままにしておく本当に重要な理由がある場合はなおさらです。

于 2011-01-27T04:42:45.077 に答える