0

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

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

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

3 回答 3

1

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

我会排除 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?
  • 是否还有其他具有类似协作的类,作为 B 的数据提供者或作为 As 数据的目标?
于 2011-01-26T11:54:47.287 回答
0

这是否是正确的 OOP 理论还有待商榷,但根据具体情况,我不会这么快就排除 C。虽然 ti 确实创建了一个相当大的依赖关系,但如果 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 彼此不了解。

于 2011-01-27T04:42:45.077 回答