2011-01-26 16 views
0

將具有固體原則和可測試性考慮,考慮以下情況:OO設計:從A級的數據複製到B

您還有一些重疊的性質A類和B類。你需要一個方法將公共屬性從A類複製和/或轉換爲B類。該方法在哪裏去?

  1. A類作爲B GetAsB()?
  2. B類作爲構造函數B(A輸入)?
  3. 作爲方法的B類void FillWithDataFrom(A input)?
  4. C類靜態方法B ConvertAtoB(A源)?
  5. ???
+0

這可能適合程序員更好.stackexchange.com – beetstra 2011-01-26 11:44:36

回答

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數據的目標?
+0

非常有趣的是,所有四種策略都應用在.Java框架中。 .NET中有非常相似的模式,我只是沒有考慮到爲什麼它以某種方式實現。你的問題也非常有幫助,謝謝。 – Nilzor 2011-01-26 12:23:06

1

我會排除1.因爲應該避免使用getter方法(告訴,不要求原理)。

我會排除2.因爲它看起來像一個轉換,如果A和B是碰巧有共同點的不同類,這不是轉換。至少,這是從描述中看來的。如果情況並非如此,那麼2也是一種選擇恕我直言。

4.是否暗示C知道B和/或C的內部細節?如果是這樣,我也排除這個選項。

我會爲3投票。

+0

是的,4暗示C意識到A和B的內部細節。感謝您的意見。給我一些思考的食物。 – Nilzor 2011-01-26 12:20:54

0

是否這是正確的面向對象的理論是否存在爭議,但根據具體情況,我不會很快就把C排除在外。雖然ti DOES創建了一個相當大的依賴關係,但如果C的特定角色是管理從A到B的交互(並複製),則可以使用該依賴關係。爲了避免在A和B之間創建依賴關係另外,C具體用於管理依賴性,並且可以考慮到這一點。

Ex。 (在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對彼此無知。

相關問題