將具有固體原則和可測試性考慮,考慮以下情況:OO設計:從A級的數據複製到B
您還有一些重疊的性質A類和B類。你需要一個方法將公共屬性從A類複製和/或轉換爲B類。該方法在哪裏去?
- A類作爲B GetAsB()?
- B類作爲構造函數B(A輸入)?
- 作爲方法的B類void FillWithDataFrom(A input)?
- C類靜態方法B ConvertAtoB(A源)?
- ???
將具有固體原則和可測試性考慮,考慮以下情況:OO設計:從A級的數據複製到B
您還有一些重疊的性質A類和B類。你需要一個方法將公共屬性從A類複製和/或轉換爲B類。該方法在哪裏去?
這取決於,在不同情況下都有意義;從Java的一些例子:
String java.lang.StringBuilder.toString()
java.lang.StringBuilder(String source)
void java.util.GregorianCalender.setTime(Date time)
ArrayList<T> java.util.Collections.list(Enumeration<T> e)
一些問題,幫助您決定:
非常有趣的是,所有四種策略都應用在.Java框架中。 .NET中有非常相似的模式,我只是沒有考慮到爲什麼它以某種方式實現。你的問題也非常有幫助,謝謝。 – Nilzor 2011-01-26 12:23:06
我會排除1.因爲應該避免使用getter方法(告訴,不要求原理)。
我會排除2.因爲它看起來像一個轉換,如果A和B是碰巧有共同點的不同類,這不是轉換。至少,這是從描述中看來的。如果情況並非如此,那麼2也是一種選擇恕我直言。
4.是否暗示C知道B和/或C的內部細節?如果是這樣,我也排除這個選項。
我會爲3投票。
是的,4暗示C意識到A和B的內部細節。感謝您的意見。給我一些思考的食物。 – Nilzor 2011-01-26 12:20:54
是否這是正確的面向對象的理論是否存在爭議,但根據具體情況,我不會很快就把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對彼此無知。
這可能適合程序員更好.stackexchange.com – beetstra 2011-01-26 11:44:36