OO设计:将数据从A类复制到B类

时间:2011-01-26 11:15:17

标签: oop testing solid-principles

考虑到SOLID原则和可测试性,请考虑以下情况:

你有A类和B类,它们有一些重叠的属性。您需要一种方法,将公共属性从A类复制和/或转换为B类。该方法在哪里?

  1. A类作为B GetAsB()?
  2. B类作为构造函数B(A输入)?
  3. B类作为方法void FillWithDataFrom(A input)?
  4. C类作为静态方法B ConvertAtoB(A源)?
  5. ???

3 个答案:

答案 0 :(得分:1)

我排除了1.因为应该避免使用getter方法(告诉,不要问原则)。

我排除2.因为它看起来像转换,如果A和B是不同的类,恰好有一些共同点,那么这不是转换。至少,这是从描述中看出来的。如果情况并非如此,那么2也可能是恕我直言。

4是否暗示C知道B和/或C的内部细节?如果是这样,我也会排除这个选项。

我投票支持3.然后。

答案 1 :(得分: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)
  5. 有些问题可以帮助您做出决定:

    • 哪种依赖更有意义?依赖于B的B,B依赖于A,既不是?
    • 您是否总是从A创建新B,或者您是否需要使用As填充现有B?
    • 是否有其他具有类似协作的类,既可以作为B的数据提供者,也可以作为As数据的目标?

答案 2 :(得分:0)

这是否是正确的OOP理论是有争议的,但根据具体情况,我不会那么快地排除C。虽然ti DOES创建了一个相当大的依赖,但如果C的特定角色是管理从A到B的交互(和复制),它可以使用它。依赖是在C中创建的,专门用于避免在A和B之间创建这种依赖此外,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对彼此无知。