Вложенные объекты и где искать данные? - PullRequest
0 голосов
/ 06 декабря 2009

Я пытаюсь переписать существующую систему с объектами. Я создал несколько базовых объектов, но не могу понять, как заставить их работать так, как я хочу.

Это основные классы:

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

Я хочу написать код, подобный приведенному ниже:

Курсы ([CourseCode]). Отзывы (1) .Categories ([CategoryID]). Комментарий или же Курсы (я) .Reviews (1) .Categories (х) .Comment

Символы между [и] представляют некоторое значение, которое будет поступать из вызывающего приложения.

Вторая часть моего вопроса связана с тем, каков наилучший способ получения данных. У меня есть вся дата, извлекаемая изнутри объектом автоматически при создании экземпляра (что может быть довольно много данных для извлечения), или есть метод, такой как GetReviews (в объекте Course) или GetComments (в объекте Review), который имеет приложение позвонить до того, как эти объекты станут доступны? Должны ли эти методы просто заполнять эти объекты внутри родительского объекта или возвращать объекты непосредственно вызывающему приложению?

Однако я собираюсь получить объект Courses в качестве некоторой точки. Мне кажется неправильным иметь этот метод в самом объекте Courses, т.е. (Courses.GetCourses ([StaffMember])) * * 1014

Я действительно просто пытаюсь приступить к программированию ОО, так как до сих пор я использовал .Net очень процедурным образом. Есть ли какие-нибудь книги, которые кто-нибудь может порекомендовать, которые служат руководством для того, как использовать ОО и различные способы его использования в зависимости от поставленной задачи? В прошлом я организовал множество уроков, которые всегда очень хорошо работали для меня, но я изо всех сил пытаюсь понять, как собрать их все вместе наилучшим образом.

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

Первая часть вашего вопроса: Да, вы можете сделать это, и да, вы, вероятно, должны сделать это, чтобы сделать ваши классы абстрактными. Мне нравится шаблон, за который ты идешь. Что вы сделаете, так это сделаете, чтобы у классов был конструктор, который получает ключ. Это будет выглядеть так:

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 или Entity Framework, NHibernate или тот, который вы создали сами. Это ваша абстракция получения данных из базы данных.

Вторая часть вашего вопроса: Если вы читаете из базы данных, рекомендуется читать данные только тогда, когда это необходимо, если поиск не требует времени и занимает много времени. Если одни и те же данные необходимо прочитать несколько раз, лучше при необходимости прочитать их один раз и кэшировать.

0 голосов
/ 06 декабря 2009

Еще один способ решения этой проблемы состоит в том, чтобы каждый класс "имел" или "содержал" другие классы. В терминологии ОО это называется составлением или агрегированием, и я считаю его более эффективным. Однако вы напишите это, чтобы прочитать данные:

Courses.GetCourse ([CourseCode]). Reviews.GetReview (1) .Categories.GetCategory ([CategoryID]). Комментарий * +1003 *

Классы будут выглядеть так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...