Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象设计:将数据从类A复制到类B P>考虑到坚实的原则和可测试性,考虑以下情况:_Oop_Testing_Solid Principles - Fatal编程技术网

Oop 面向对象设计:将数据从类A复制到类B P>考虑到坚实的原则和可测试性,考虑以下情况:

Oop 面向对象设计:将数据从类A复制到类B P>考虑到坚实的原则和可测试性,考虑以下情况:,oop,testing,solid-principles,Oop,Testing,Solid Principles,类A和类B有一些重叠的属性。您需要一个将公共属性从类a复制和/或转换为类B的方法。该方法在哪里 类A作为B GetAsB() B类作为构造函数B(输入) B类作为方法void FillWithDataFrom(输入) 类C作为静态方法B转换器B(源) 我会排除1。因为应该避免使用getter方法(告诉,不问原则) 我排除第二条。因为它看起来像一个转换,如果a和B是不同的类,碰巧有一些共同点,那么这不是一个转换。至少,从描述中可以看出这一点。如果不是这样的话,2也将是一个选择 是的。意味着C知道

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

  • 类A作为B GetAsB()
  • B类作为构造函数B(输入)
  • B类作为方法void FillWithDataFrom(输入)
  • 类C作为静态方法B转换器B(源)

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

    我排除第二条。因为它看起来像一个转换,如果a和B是不同的类,碰巧有一些共同点,那么这不是一个转换。至少,从描述中可以看出这一点。如果不是这样的话,2也将是一个选择

    是的。意味着C知道B和/或C的内部细节?如果是这样,我也会排除这个选择


    我投3票。然后。

    视情况而定,在不同的情况下都有意义;Java中的一些示例:

  • String java.lang.StringBuilder.toString()
  • java.lang.StringBuilder(字符串源代码)
  • void java.util.GregorianCalender.setTime(日期时间)
  • ArrayList java.util.Collections.list(枚举e)
  • 一些问题可以帮助您做出决定:

    • 哪个依赖关系更有意义?A依赖于B,B依赖于A,两者都不是
    • 您是否总是从a创建新的B,还是需要使用As填充现有的B
    • 是否有其他类具有类似的协作,或者作为Bs的数据提供者,或者作为as数据的目标

      • 这是否是正确的OOP理论有待讨论,但根据具体情况,我不会很快排除C。虽然ti确实创建了一个相当大的依赖项,但如果C的特定角色是管理从a到B的交互(和复制),它可以发挥作用。在C中创建依赖项是为了避免在a和B之间创建这样的依赖项。此外,C的存在是为了管理依赖项,并且可以考虑到这一点来实现

        例如(在vb.Net/伪代码中):

        如果有具体的理由创建(比如)AtoBConverterClass,那么这种方法可能是有效的


        同样,这可能是一个特殊情况。然而,我发现它有时很有用。特别是如果有非常重要的原因让A和B彼此不了解的话

        这可能更适合程序员。stackexchange.com是的,4意味着C知道A和B的内部细节。谢谢你的意见。给了我一些思考的素材。非常有趣的是,这四种策略都应用于.Java框架中。NET中有非常相似的模式,我只是没有仔细考虑它为什么以这种或那种方式实现。你的问题也很有帮助,谢谢。
        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