【问题标题】:Best approach to update wrapped object更新包装对象的最佳方法
【发布时间】:2012-04-24 11:58:23
【问题描述】:

我使用的是 VB.NET,但这个问题适用于任何 OO 语言 - Java、C# 等。我已经用 Java 和 C# 标记了这个问题,但如果认为不合适会删除。

我有一个实体类 ClassAAA,其中包含对 ClassBBB 的引用作为它的属性之一:

Public Class ClassAAA

    Private Property _blah As ClassBBB = Nothing
    Private Property _somethingElse As String
    Private Property _anotherthing As String

    ' Make it private so cannot instantiate class without supplying ClassBBB '
    Private Sub New()
    End Sub

    Public Sub New(ByRef value As ClassBBB)
        _blah = value
    End Sub

    Public Property ImportantAttribute As String
        Get
            Return _blah.Imp
        End Get
        Set(ByVal value As String)
            _blah.Imp = value
        End Set
     End Property

      ' other stuff '
End Class

我不想在实体类之外暴露ClassBBB。这是我的问题:我想对ClassAAA 进行更新,并且我想使用ClassBBB 的静态/共享更新方法。最好的方法是什么?

Public Shared Sub UpdateClassAAA(byRef value as ClassAAA)

   ' XXX Cannot do this because ClassBBB reference is private XXX '
    ClassBBBDAO.update(value._blah)

    ' Do other updates on other ClassAAA attributes '

End Sub

我可以将ClassBBB 引用公开(或提供一个公开的getter 方法),但这会暴露ClassAAA 的内部工作原理。

我想做的是使ClassBBB 引用Friend 以便它仅在程序集中可见,即数据层,对客户端项目不可见。但这仍然感觉像是我在揭露班级的内部运作。

有更好的方法吗?

【问题讨论】:

    标签: c# java vb.net oop design-patterns


    【解决方案1】:

    我认为,简单的想法是在 inside ClassAAA 中创建一个公共更新方法,并让其他类按需调用它。这样您就不会暴露ClassAAA 的内部细节,但可以让其他人激活所需的功能。

    【讨论】:

      【解决方案2】:

      如果ClassAAA 隐藏并封装ClassBBB,那么ClassAAA 应该有一个内部 更新ClassBBB 的公共方法。 facade 设计模式是一个很好的例子,它以一种优雅而优雅的方式说明了您的问题的解决方案。

      【讨论】:

      • 是的,你猜你是对的 - 我将不得不放弃共享/静态 CRUD 方法并将它们移动到实体类本身中。
      【解决方案3】:

      我认为您只需为 ClassBBB 成员创建一个 getter 或将更新方法设置为类方法而不是静态方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 2020-06-29
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多