2009-12-06 6 views
0

J'essaie de réécrire un système existant avec des objets. J'ai créé quelques objets de base mais je suis coincé sur exactement comment les faire fonctionner comme je veux.Imbrication d'objets et où récupérer des données?

Ce sont les classes de base:

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 

Ce que je veux être en mesure de le faire est le code d'écriture comme ci-dessous:.

Cours ([CourseCode]) Avis (1) .Categories ([CategoryID]). Commentaire ou Cours (i) .Reviews (1) .Categories (x) .comment

caractères entre [et] représentent une valeur qui va venir de l'application appelante.

La deuxième partie de ma question concerne le meilleur moyen de récupérer les données. Est-ce que toutes les dates sont récupérées automatiquement par l'objet lors de l'instanciation (ce qui peut être beaucoup de données à extraire) ou ont une méthode comme GetReviews (dans l'objet Course) ou GetComments (dans l'objet Review) appeler avant que ces objets deviennent disponibles? Ces méthodes doivent-elles simplement remplir ces objets dans leur objet parent ou renvoyer les objets directement à l'application appelante?

Cependant, je vais vouloir récupérer l'objet Courses comme un point. Pour moi, il semble erroné d'avoir cette méthode dans l'objet Courses lui-même. (Courses.GetCourses ([StaffMember]))

Je suis vraiment juste en train d'essayer de programmer OO, car j'ai utilisé .Net d'une manière très procédurale jusqu'à maintenant. Y at-il des livres que n'importe qui peut recommander qui agissent comme un guide pour utiliser OO et les différentes façons de l'utiliser en fonction de la tâche à accomplir? J'ai créé beaucoup de classes dans le passé, ce qui a toujours fonctionné très bien pour moi, mais j'ai du mal à trouver comment les mettre ensemble de la meilleure façon possible.

Répondre

0

Une autre façon de résoudre ce problème consiste à avoir chaque classe "avoir" ou "contenir" les autres classes. C'est ce qu'on appelle la composition ou l'agrégation dans la terminologie OO et je la considère comme une conception plus efficace. Cependant, vous écrirez ceci pour lire les données:

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

Les classes se présenteront comme suit:

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 
+0

Merci pour vos réponses Rap, je pense qu'une combinaison de ces deux méthodes sera parfait pour mon problème. Je vous ai marqué comme la réponse, merci beaucoup. – hermiod

1

Première partie de votre question: Oui, vous pouvez le faire et oui, vous devriez probablement dans le but de rendre vos classes abstraites. J'aime le motif que tu veux. Ce que vous ferez est de faire en sorte que les classes aient un constructeur qui reçoive la clé. Il ressemblera à ceci:

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 

... où « TheORM » est votre objet gestionnaire relationnel, comme LINQ to SQL ou Entity Framework ou NHibernate ou que vous vous créé. C'est votre abstraction de saisir des données de la base de données.

Deuxième partie de votre question: Si vous lisez une base de données, il est recommandé de ne lire les données que lorsque cela est nécessaire, dans la mesure où la récupération n'est pas urgente et prendrait beaucoup de temps. Si les mêmes données doivent être lues plusieurs fois, il est préférable de les lire une fois en cas de besoin et de les mettre en cache.