【问题标题】:Nesting objects and where to retrieve data?嵌套对象以及在哪里检索数据?
【发布时间】:2009-12-06 14:33:10
【问题描述】:

我正在尝试用对象重写现有系统。我已经创建了一些基本对象,但我一直坚持如何让它们按我想要的方式工作。

这些是基本类:

Public Class Course
    Public AcadPeriod As String
    Public AoSCode As String
    Public AoSPeriod As String
    Public Title As String

    Public Reviews As New Reviews
End Class

Public Class Courses
    Inherits CollectionBase

    Public Sub Add(ByVal cse As Course)
        List.Add(cse)
    End Sub
End Class

Public Class Review
    Public ReviewID As String

    Public Categories As Categories
End Class

Public Class Reviews
    Inherits CollectionBase

    Public Sub Add(ByVal rev As Review)
        List.Add(rev)
    End Sub
End Class

Public Class Category
    Public CategoryID As String
    Public CategoryName As String
    Public Comment As String
    Public MeasureValue As Integer
    Public CompletedBy As String
    Public CompletedDate As DateTime
End Class

Public Class Categories
    Inherits CollectionBase

    Public Sub Add(ByVal cat As Category)
        List.Add(cat)
    End Sub
End Class

我想做的是编写如下代码:

Courses([CourseCode]).Reviews(1).Categories([CategoryID]).Comment 或者 Courses(i).Reviews(1).Categories(x).Comment

[ 和 ] 之间的字符表示将来自调用应用程序的一些值。

我的问题的第二部分与检索数据的最佳方式有关。我是否在实例化时由对象自动在内部检索所有日期(这可能需要检索大量数据),或者是否有应用程序具有的 GetReviews(在 Course 对象内)或 GetComments(在 Review 对象内)之类的方法在这些对象可用之前调用? 这些方法应该简单地在它们的父对象中填充这些对象,还是直接将对象返回给调用应用程序?

但是,我将要检索 Courses 对象作为某个点。对我来说,在 Courses 对象本身中使用此方法似乎是错误的,即。 (Courses.GetCourses([StaffMember]))

我真的只是想进入编程 OO,因为到目前为止我一直以非常程序化的方式使用 .Net。是否有任何人可以推荐的书籍作为如何使用 OO 的指南以及根据手头的任务使用它的不同方式? 过去我创建了很多课程,这些课程对我来说一直都很有效,但我很难弄清楚如何以最好的方式将它们组合在一起。

【问题讨论】:

    标签: asp.net vb.net oop class nested


    【解决方案1】:

    您问题的第一部分: 是的,您可以这样做,是的,您可能应该这样做以使您的类抽象。我喜欢你想要的模式。您要做的是使类具有接收密钥的构造函数。它看起来像这样:

    Public Class Course
        Public AcadPeriod As String
        Public AoSCode As String
        Public AoSPeriod As String
        Public Title As String
    
        Public Reviews As New Reviews()
    
        Public Sub New(CourseCode As String)
            Dim myORM = New TheORM()
            Me.AcadPeriod = myORM.GetAcadPeriod(CourseCode)
            Me.AoSCode = myORM.GetAoSCode(CourseCode)
            ' And so forth for all the properties
        End Sub
    End Class
    

    ... 其中“TheORM”是您的对象关系管理器,例如 Linq-To-SQL 或实体框架或 NHibernate 或您自己创建的一个。它是您从数据库中获取数据的抽象。

    您问题的第二部分: 如果您正在从数据库中读取数据,最佳做法是仅在需要时读取数据,只要检索对时间不敏感并且需要很长时间。如果需要多次读取相同的数据,最好在需要时读取一次并缓存。

    【讨论】:

      【解决方案2】:

      解决这个问题的另一种方法是让每个类“拥有”或“包含”其他类。这在 OO 术语中称为组合或聚合,我认为它是一种更有效的设计。但是,您将编写此代码来读取数据:

      Courses.GetCourse([CourseCode]).Reviews.GetReview(1).Categories.GetCategory([CategoryID]).Comment

      类看起来像这样:

      Public Class Courses
          Public Courses As Dictionary(Of String,Courses)()
          Public Sub New()
              'Load your courses into Me.Courses here
          End Sub
          Public Function GetCourse(CourseCode As String) As Course
              Return Me.Courses(CourseCode)
          End Function
      End Class
      

      【讨论】:

      • 感谢您的回答 Rap,我认为这两种方法的组合将完美解决我的问题。我已将您标记为答案,非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 2017-07-09
      • 2017-09-27
      • 2020-11-09
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多