【问题标题】:OOP - Objects For Entities With Master Lists and Object CompositionOOP - 具有主列表和对象组合的实体的对象
【发布时间】:2009-02-23 19:06:16
【问题描述】:

我正在努力思考如何为以下业务对象正确实施 OOP 设计:

  1. 在数据库中有一个“主列表”(例如分类)
  2. 作为属性(即对象组合)是另一个对象的一部分,但具有其他属性

这就是我停留在理论的地方。假设我有一个分类对象,它继承自抽象类 BusinessObject 并定义了 CRUD 函数 (MustOverride)。这会给我:

Public MustInherit Class BusinessObject
    Public Sub New()

    End Sub

    Public MustOverride Function Create() As Boolean
    Public MustOverride Sub Read(ByVal id As Integer)
    Public MustOverride Function Update() As Boolean
    Public MustOverride Function Delete() As Boolean
End Class

Public Class Classification
    Inherits BusinessObject

    <Fields, properties, etc. for ID, Name (or Description), and 
     IsActive. DB table has only these 3 fields.>

    Public Sub New()
        MyBase.New()
    End Sub

    Public Overrides Function Create() As Boolean
        Dal.Classifications.Create(Me)
    End Function

    Public Overrides Function Delete() As Boolean
        Dal.Classifications.Delete(Me)
    End Function

    Public Overloads Overrides Sub Read(ByVal id As Integer)
        Dal.Classifications.Read(Me)
    End Sub

    Public Overrides Function Update() As Boolean
        Dal.Classifications.Update(Me)
    End Function
End Class

这将允许我在系统管理员可以管理系统中的分类主列表的表单上使用分类对象。这里没有问题。

现在,我希望客户对象具有分类类型(对象组合)的属性,但有一个警告 - 当分类对象成为客户对象的属性时,它需要一个额外的字段级别。级别是根据业务分类的逻辑部分 - 分类具有应用程序用户输入的数字级别。所以我创建了一个继承自Classification的类CustomerClassification:

Public Class CustomerClassification
    Inherits Classification

    Private _level As Integer

    Public Property Level() As Integer
        Get
            Return _level
        End Get
        Set(ByVal value As Integer)
            _level = value
        End Set
    End Property

    Public Sub New()
        MyBase.New()
    End Sub
End Class

而 Customer 对象将由 CustomerClassification 组成:

Public Class Customer
    Inherits BusinessObject

    Public Property Classification() As CustomerClassification
    ........ etc
End Class

现在,我的设计问题是 Create、Read、Update 和 Delete 函数仍然暴露在 CustomerClassification 对象中:

Dim c as New Customer
c.CustomerClassification.Update() ' <-- Not desirable!

我可以在这里实现什么样的其他设计?很明显我设计的方式错误,但我没有看到一个简单的替代模式。我不想通过不继承分类并重复所有字段和属性代码来重复 CustomerClassification 类中的代码,但我也不想将 CRUD 函数发布到 CustomerClassification 级别。在查看整体类设计时我缺少什么?

编辑:分类级别保存到数据库将由客户对象处理,因为数据库是旧的并且级别的字段是在客户表中定义的.

【问题讨论】:

    标签: vb.net oop theory


    【解决方案1】:

    如果我正确理解您的问题,您的客户类不需要聚合实际分类类的实例。它需要有一个单独的类的实例,它指定了分类的级别和类型,由 ID 或枚举值表示。分类类只能在管理员维护分类 ID/枚举列表的场景中使用。

    【讨论】:

    • 好的,我会这样,创建一个具有ClassificationID 和Level 的类(不从任何东西继承),看看我想出了什么。谢谢!
    • 我只是在想。我的真实对象不是“客户”(只是一个简化的例子)。真正的对象将由许多具有“主列表”的对象组成,这意味着我必须为 every 将用于组合的主列表对象创建一个新的第二类实物?
    • 基本上是的。但是,您应该真正考虑职责分离。其中一个类负责维护列表元素。另一个只是列表中值的一个小包装。
    • 太棒了。谢谢(你的)信息。我只是想确保我没有不必要地重复工作。
    【解决方案2】:

    所以,如果我理解正确,您希望 Update() 函数仅可用于 Customer 类。

    如果您的ClassificationCustomer 类部署在同一个程序集中,您可以将Update() 函数标记为friend。这将使该程序集之外的类无法访问它。

    【讨论】:

    • 我希望 Classification 类和 Customer 类都具有 CRUD 功能,但我不希望 CustomerClassification 具有它们。我是否应该只在 Customer 类中为分类提供两个属性:ClassificationID 和 Level,前面的组合?
    • 这个想法是在客户表单上有一个包含列表(分类)的组合框,并设置 Customer.CustomerClassification = ComboBox.SelectedItem。
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2018-12-02
    相关资源
    最近更新 更多