牢记 SOLID 原则和可测试性,考虑以下情况:
您有 A 类和 B 类,它们具有一些重叠的属性。您想要一个方法,将公共属性从 A 类复制和/或转换到 B 类。该方法在哪里?
- A 类作为 B GetAsB() ?
- B类作为构造函数B(A输入)?
- B 类作为方法 void FillWithDataFrom(A input)?
- C类作为静态方法B ConvertAtoB(A source)?
- ???
牢记 SOLID 原则和可测试性,考虑以下情况:
您有 A 类和 B 类,它们具有一些重叠的属性。您想要一个方法,将公共属性从 A 类复制和/或转换到 B 类。该方法在哪里?
我会排除 1. 因为应该避免使用 getter 方法(告诉,不要问原则)。
我会排除 2. 因为它看起来像一个转换,如果 A 和 B 是恰好有共同点的不同类,这不是转换。至少,从描述中看起来是这样的。如果不是这种情况,恕我直言,2 也是一个选项。
4. 是否暗示 C 知道 B 和/或 C 的内部细节?如果是这样,我也会排除这个选项。
我会投票给 3。那么。
这取决于,在不同的情况下都有意义;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)
一些可以帮助您做出决定的问题:
这是否是正确的 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 彼此不了解。