这种变通方法/架构/方法是否正确使用类(复杂属性)?

时间:2012-02-15 18:32:59

标签: vb.net oop class architecture

我有点困惑使用OOP,我的意思是,我已经知道(或者我猜)什么是类,对象,方法,属性和类似的东西,但我怀疑:

让我们假设我有一个班级“洗衣”这个班级(仅为本例)3个属性:

  1. laundryID

  2. 名称

  3. 垫圈

  4. Id和Name是“原始”类型或简单类型(整数和字符串),但是Washers表示“Washer”类型的对象列表,它具有3个属性:

    1. washerID

    2. laundryID

    3. 容量

    4. 品牌

    5. 所有这些(对于此示例)简单/基元类型(整数,字符串,字符串)。

      所以这就是我的困境,拥有像这样的构造函数(VB .net)

      是正确的
      public sub new(ByVal laundryID as integer)
             '' Here I'll query for the data of the Laundry on DB
             '' After that I will query for every washer that belongs to this laundry
             '' Then I will create a washer object for every row and add it to the 
             '' property "Washers" of the "Laundry"
      end Sub
      

      在构造函数内部查询属于洗衣店的所有洗衣机的id = laundryID参数,并创建“Washer”类型的对象并将它们添加到Laundry列表中?

      我不确定如果我解释自己,任何评论我会非常感激,用更少的话来说,使用具有复杂属性的类/对象的正确方法(或良好实践)是什么(其他类/对象)。

      我通常使用ADO.net,可能ADO / LINQ / Entity以透明的方式解决这个问题,但如果他们这样做我真的不知道。

      注意:我熟悉VB.net,C#,PHP,所以如果你更喜欢解释/帮我使用带语法的例子,那没关系。

2 个答案:

答案 0 :(得分:2)

在OOP世界中你有很多选择,我在这里包括两个:

  1. 在洗衣店构造函数中加载
  2. 首次引用Laundry.Washers时加载(延迟加载)
  3. 这里的主要区别在于,如果您要加载1000个洗衣对象(比如在列表中显示它们),您将无法启动1000个单独的查询来加载其洗衣机。如果有人选择了洗衣店并向下钻取,则在您需要数据时会加载洗衣机。

    Public Class Laundry
        Private _laundryId As Integer
        Private _name As String
        Private _washers As List(Of Washer)
        Public Sub New(ByVal LaundryId As Integer)
            _laundryId = LaundryId
            ' option one - load them when the Laundry class loads
            LoadWashers()
        End Sub
    
        Public ReadOnly Property Washers As List(Of Washer)
            Get
                If _washers Is Nothing Then
                    ' option two - load them the first time the washers properties are referenced
                    LoadWashers()
                End If
                Return _washers
            End Get
        End Property
    
        Private Sub LoadWashers()
            _washers = New List(Of Washer)
            ' load the washers here
            '...
            '...
    
        End Sub
    End Class
    

答案 1 :(得分:1)

你的构造函数很好。你基本上说如果你有一个身份证号码,你只能制作一个洗衣舱,在这种情况下,如果LaundryID不是一个有效的身份证号码,你应该抛出一个例外。

我经常把像Washers列表这样的东西暴露为IEnumerable(Of Washer),这样我班级的消费者就无法自己控制列表。

这是一个简单的例子:

Public Class Laundry
  Private _LaundryID As Integer
  Private _LaundryName As String
  Private _Washers As List(Of Washers)

  Public Sub New(ByVal laundryID As Integer)
    _LaundryID = laundryID
    _Washers = New List(Of Washers)
    '// populate washers
    '// throw exception if something went wrong
  End Sub

  '// Properties

  Public ReadOnly Property Washers As IEnumerable(Of Washer)
    Get
      Return _Washers
    End Get
  End Property

End Class

如何创建新的Laundry对象取决于您。它可能只是一个空构造函数,或者是一个Shared函数,它为您返回一个新的Laundry对象,其中包含来自数据库(或任何地方)的预先填充的ID号。