Choix d'une méthode, classe ou bien ?

Résolu
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 30 mai 2010 à 18:50
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 1 juin 2010 à 20:04
Bonsoir la team,
J'ai une question pour vous, je vous expose le besoin (trés simple mais bon)
Je dois traiter et sauvegarder une affaire, cette affaire contient plusieurs lignes, chacune de ces lignes contient plusieurs référence.
Ceci est donc une BDD mais sans liens, juste des listof imbriquées.
Donc voici comment je gére la chose :
une classe cls_affaire, une classe cls_reseau, une classe cls_segment et enfin une classe cls_marquage, la classe affaire regroupe donc dans une listof la classe cls_reseau et ainsi de suite :

cls_affaire
nom_affaire
segment_type
liste_reseaux as list of cls_reseau
nom_reseau
diametre
liste_segments as list of cls_segment
segment_ID
segment_nom
segment_type_deb
segment_type_fin
segment_longueur
segment_commentaire
liste_marquages as list of cls_marquage
marque_nom
marque_longueur

21 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 juin 2010 à 09:24
En fait voila à quoi je pensais :

<Serializable()> _
Public Class SegmentCollection
    Inherits List(Of Segment)
    '
    Public ReadOnly Property ItemByID(ByVal id As String) As Segment
        Get
            For Each Item As Segment In Me
                If Item.ID.ToLower = id.ToLower Then
                    Return Item
                End If
            Next
            Return Nothing
        End Get
    End Property
    '
    Public ReadOnly Property ItemByName(ByVal name As String) As Segment
        Get
            For Each Item As Segment In Me
                If Item.Nom.ToLower = name.ToLower Then
                    Return Item
                End If
            Next
            Return Nothing
        End Get
    End Property
    '
End Class
<Serializable()> _
Public Class Segment
    '
    Public ID As String
    Public Nom As String
    Public Type_Deb, Segment_Type_Fin As String
    Public Commentaire As String
    '
    Public Marquages As New MarquageCollection
    '
End Class
<Serializable()> _
Public Class MarquageCollection
    Inherits List(Of Marquage)

End Class
<Serializable()> _
Public Class Marquage
    '
    'Public Toto As Tata... 
    '
End Class



Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
3
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
30 mai 2010 à 18:54
Mon code est donc du type :
For liste As Integer = 0 To Me.liste_reseaux.Item(index).liste_segments.Count - 1
affaire.liste_reseaux.Item(index).liste_segments.Item(liste).segment_nom
next

maintenant cela va devenir de plus en plus complexe de gérer tous ces index !
affaire.liste_reseaux.item(index1).liste_segments.item(index2).liste_marquages.item(index3).marque_nom.


Pensez vous qu'il y a une meilleur façon de faire ?

@ vous lire, cordialemnt @dn.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
30 mai 2010 à 19:57
Salut ADN,

Moi je dirais que la méthode à employer est selon ton besoin.

Par exemple, si tu as besoin dans ton projet de lister toutes les affaires dont le nom du segment "tata" et le réseau est "toto", le choix est vite fait => Base de données, sinon tu va te retrouver avec des boucle à gogo et ton prog sera lent/gourmand en ressource.

Après si t'as juste besoin d'éditer ces classes via des formulaire, une simple série de classes imbriqués et sérialisable feront l'affaire.

Tu n'auras, qu'à créer un propriété public pour chaque formulaire (moi, c'est comme ca que je traite). Ex concret pour la classe cls_segment :

Public Class dlg_Edit_segment

Private _Segment As cls_segment 

Private Property Segment As cls_segment 
    Get
       Return _Segment
    End Get
    Set(value As cls_segment)
       _Segment = Value
    End Set
End Property

Private Sub Form_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'Ton code pour charger le formulaire
    If _Segment IsNot Nothing Then
       Me.TxtName.Text = Segment.Nom
       'Ainsi de suite... 
    Else
       _Segment = New cls_segment 
    End If  
End Sub
'Un bouton Save, etc...
'
End class



Et donc tu passe ta classe au formulaire, celui-ci te la retoune modifier ou non

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
31 mai 2010 à 12:57
oui en effet ce que je fais j'ai même simplement définie les propriétés sans les get/set car il n'y aucune modif ou vérification à faire.
Ve qui me géne dans cette méthode c'est que tout le fichier sérialisé est en mémoire.
Et puis jongler avec trop d'indexs est une source d'erreur non négligeable.
Pour la BDD j'aimerai bien mais je trouve le codage lourd et pas trés clair, les dataset et autre recordset j'y pige pas grand chose, j'ai bien reussi à faire un bout de code qui marche, mais je l'ai pas entiérement digéré.
Voila pourquoi j'aimerai avoir l'avis des confirmé comme toi.
Il y a peu être un entre les deux ?

faire des classes mais pas imbriqué ? avec GUID pour chaques lignes ? je ne sais pas.
En tout cas merci pour ton avis.
cordialement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
31 mai 2010 à 12:58
Voici ma classe segment par exemple

Option Explicit On
Option Strict On
Imports System
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

<Serializable()> Public Class cls_segment
    Public segment_ID As String 'index du segment
    Public segment_nom As String 'nom du segment

    Public segment_type_deb, segment_type_fin As String 'type des bouts du segment
    Public segment_longueur As Double 'longueur du segment
    Public segment_commentaire As String 'commentaire facultatif
    Public liste_marquages As List(Of cls_marquage)


    ' attribut un nouvel ID à chaque nouvelle ligne.
    Public Sub New()
        segment_ID = System.Guid.NewGuid.ToString
        liste_marquages = New List(Of cls_marquage) 'et intancie (new)
    End Sub

    Public Sub Add(ByVal Marque As cls_marquage)
        liste_marquages.Add(Marque)
    End Sub

    Public Sub Remove(ByVal index As Integer)
        ' contrôle.
        If index > Count - 1 Or index < 0 Then
            System.Windows.Forms.MessageBox.Show("Index non  valide!")
        Else
            ' Appelle la méthode RemoveAt de l'objet collection.
            liste_marquages.RemoveAt(index)
        End If
    End Sub

    Public ReadOnly Property Item(ByVal Index As Integer) As cls_marquage
        Get
            Item = liste_marquages.Item(Index)  'retourne un segment
        End Get
    End Property

    Public ReadOnly Property count() As Integer
        Get
            count = liste_marquages.Count  'retourne le nombre de segments
        End Get
    End Property

End Class
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 mai 2010 à 13:56
Voila comment je procederais :

Public Class MainClass

    Private _Childs As New ChildCollection

    Public Property Childs As ChildCollection
        Get
            Return _Childs
        End Get
        Set(ByVal value As ChildCollection)
            _Childs = value
        End Set
    End Property
    '
    Public Class ChildCollection
        Inherits List(Of ChildClass)
        '
        Public ReadOnly Property ItemByID(ByVal id As Guid) As ChildClass
            Get
                For Each Item As ChildClass In Me
                    If Item.ID.Equals(id) Then
                        Return Item
                    End If
                Next
                Return Nothing
            End Get
        End Property
        Public ReadOnly Property ItemByName(ByVal name As String) As ChildClass
            Get
                For Each Item As ChildClass In Me
                    If Item.Name.ToLower = name.ToLower Then
                        Return Item
                    End If
                Next
                Return Nothing
            End Get
        End Property
        '
    End Class
    '
    Public Class ChildClass
        '
        Private _ID As Guid = Guid.NewGuid
        Private _Name As String
        '
        Public Property Name As String
            Get
                Return _Name
            End Get
            Set(ByVal value As String)
                _Name = value
            End Set
        End Property
        Public Property ID As Guid
            Get
                Return _ID
            End Get
            Set(ByVal value As Guid)
                _ID = value
            End Set
        End Property
        '
        Public Sub New()
        End Sub
        Public Sub New(ByVal name As String)
            _Name = name
        End Sub
        '
    End Class
    '
End Class


Et pour l'appel de cette classe :

Dim mc As New MainClass

mc.Childs.Add(New MainClass.ChildClass("Item 1"))

Dim item As MainClass.ChildClass = mc.Childs.ItemByName("Item 1")


Et ainsi de suite, on peut le faire avec plusieurs classes ce qui donnerais pour toi:

Segment.ItemByName("Toto").liste_marquages.ItemByName("Tata")

C'est surtout au niveau de la saisie que c'est le plus galère, comme je te l'ai dit plus haut il faut passer les classes aux formulaires qui les traiteront et te les retourneront.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
31 mai 2010 à 17:45
Ca y est tu m'as tout perdu ^^
pourquoi le inhérit ?
différence avec ma class ?
pourquoi passer par des variables private dans ChildClass avec les get/set ?
j'ai du mal à tout comprendre dans ton code
j'suis débutant contrairement à ce que pense certain
merci, a te lire ++
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 mai 2010 à 18:16
En fait le Get/Set définis une variable en tant que propriété, ce n'est pas obligatoire mais c'est plus propre de plus tu peu intercepter l'évement Ex:

Public Class MaClass
    '
    Public Event TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    '
    Private _Text As String' On déclare le cham privé car c'est la propriété qui sera public, donc pas besoin de voir celui-ci.
    '
    Public Property Text
        Get 'Ce code est exécuté lors d'un appel à: Toto = IsntanceDeMaClasse.Text (On demande la valeur de la propriété Text).
            Return _Text
        End Get
        Set(ByVal value) 'Ici c'est le contraire on défini sa propriété : IsntanceDeMaClasse.Text = "Bla Bla Bla...".
            _Text = value
            RaiseEvent TextChanged(Me, New EventArgs) 'On sait que la propriété a changé et on déclanche l'événement.
        End Set
    End Property
    '
End Class


Pour le reste, si tu déclare une classe InHerits elle hérite de toute les méthodes/propriétés de cette classe, et tu peux lui en rajouter.

Ainsi une classe déclaré InHerits List(Of Toto) possede déjà toutes les propriétés d'une List(Of Toto), Add, AddRange, Remove, RemoveAt etc... Nul besoin de les réécrire. Tu peux donc faire :

LaClasseHeritante.Add(New Toto)
LaClasseHeritante.Item(3).Remove

Et ainsi de suite...

J'espere que c'est un peu plus claire ? C'est pas évidant la manipulation des classes en .Net, j'ai mis un moment à comprendre le principe entre toutes les possibilités (Protected, Overrides InHerits, MustHerits et j'en passe...).

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
31 mai 2010 à 18:52
Ok , mais dans mon cas ? quelle est l'utilité ? je ne pige pas, vraiment pas.
Mais bon il est tard et mon cerveau esst un peu crevé, merci pour la rapidité de tes réponses.
A demain si tu veux bien.
merci encore de ton aide.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 mai 2010 à 21:43
Bah pour les propriétés aucune, c'était juste pour la propreté de la chose, pour ce qui est de l'héritage ca évite d'avoir à saisir le code de la Collection.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 08:00
salut, ben écoute je cogite depuis 1heure sur ta méthode et je ne vois vraiment pas de quoi ou plutôt de qui je pourrais hériter dasn mon ex :( ça m'agace à vrai dire car je sens qu'il y a un truc interressant la dessous.
++
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 16:03
Je commence à entre voir la lumiére ^^
En fait tu remplace mes list of (classe1) par une nouvelle classe qui est une collection de la classe1 ?

bon spa gagné même à écrire lol.

tu sais ce que j'ai envie de faire ? (si tu dis oui, je te paye une biére)
Et bien je vais faire l'inverse !
Je vais écrire les méthodes pour utiliser mon object affaire, et ce de la façon la plus simple possible. Aprés je n'aurais qu'a me démerder pour que mon objet "AFFAIRE" fasse tout ce que je lui demande (Encapsulation)
Voila que penses tu de cette méthode ?
Hum au fait en lisant un cours sur la POO en C++ j'ai vu que toute les attributs (variables) doivent être private ! cela parait logique, donc cela serait mieux de passer par une méthode pour avoir par exemple le nom de l'affaire ?
cordialement (le nouveau @dn is under bulding ^^)
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 16:21
Donc voila à quoi cela pourrait ressembler :
dans le main
Dim affaire as new cls_affaire
Dim reseau as new csl_reseau
Dim segment as new cls_segment
Dim marque as new cls_marquage
-----
Affaire.Add(reseau)
Affaire.Add(Id_reseau, segment)
Affaire.Add(Id_segment, marque)
Idem pour le remove ou autre (en surchage)

Ensuite pour avoir accés aux attributs en private :
Dim LeNomAffaire as string = Affaire.nom()
si cela se trouve cela revient à faire des get/set sur les propriétés, mais là c'est plus une méthode pour avoir le nom de la variable private.

Est-ce que je suis sur la bonne voie ?
PS : PCPT si tu passe dans le coin à tu un avis steuplé ?
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 juin 2010 à 16:40
Je vais écrire les méthodes pour utiliser mon object affaire, et ce de la façon la plus simple possible. Aprés je n'aurais qu'a me démerder pour que mon objet "AFFAIRE" fasse tout ce que je lui demande (Encapsulation)


Je ne vois pas trop, en même temps je connais pas ton projet, je ne sais pas trop ce que tu veux lui faire faire...

Hum au fait en lisant un cours sur la POO en C++ j'ai vu que toute les attributs (variables) doivent être private !


Alors pourquoi autoriser les variables publique ? Nan mais c'est vrai que c'est plus propre comme je te l'ai dit plus haut de garder les variables privées et de créer des propriétés publiques.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 18:00
Tu sais pour l'instant je parle plus philosophie que codage.
En gros l'appli serait une GPAO, l'utilisateur créé une affaire et lui attribue plusieurs réseaux (tube de circuit d'eau), pour chaque réseaux il y a des segments à définir (morceaux de tubes constituant le réseau) et enfin pour chaque segment une ou plusieurs zones de marquage pour que les gars sur le chantier retrouve les segments à souder.
Mais partons déja de la class, voici deux organisation possible :
En haut une imbrication de list of qui permet d'avoir pour un reseau la list des segments et des marquages par ITEM.
En bas une version ou toutes les listes se retrouve à la racine de l'affaire, avec donc pour le coup un ID obligatoire pour retrouver nos listes (surrement plus lourd à gérer car plein de boucle de recherche)
Quelle est ton opinion la dessus ? (je trouve la premiére plus logique)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 juin 2010 à 18:32
Si tu veux mon avis, il faut surtout le voir au niveau des performances :

Dans le cas de la première méthode => Il ne faut pas négliger la quantité de données qui sera sérialisé, si ton fichier atteint par exemple les 500Mo, ceux-ci seront chargés entièrement lors de la déserialisation de la classe, de même, une petite modification sur un marquage, engendrera une écriture sur le disque de l'ensemble des données.

Dans le cas de la seconde méthode => Très bonne soluce, je dirais même la meilleur, seul hic, c'est ingérable au niveau des classes, je te conseille donc l'utilisation d'une base de données SQL CE, c'est très simple à utiliser et à déployer, si t'as des question la dessus n'hésite pas.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 19:09
Merci pour les réponses,
je te dirais :
1-La taille d'un fichier affaire ne devrait pas dépasser le Mo.
2-De toute façon je pense sérialiser enregistrer le fichier par affaire (plus simple pour archiver) Bdd sql ou class

Si tu es vraiment dispo à m'expliquer les bdd SQL, je suis ton éléve, mais je te préviens :
1-Je maitrise qu'a peu pret la POO, donc les class
2-J'ai essayé ADO.NET et j'y pige que kouik (malfrés des effort de lecture de divers tutos)

Toujours partant ?

merci pour ton aide.
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 19:13
pour finir ce soir (tu le sais petite tête j'ai, et vite pleine elle est ^^)
voici le code que j'ai pondu à l'arrache suivant le principe des classes imbriqué en list of
si cela peut aider à comprendre le besoin ;)

@ bientôt l'ami.


http://www.cijoint.fr/cjlink.php?file=cj201006/cij0hvg4UQ.zip
0
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
1 juin 2010 à 19:17
oups, faire ouvri affaire et choisir l'affaire marque :)
@++ bonne soirée à toi, je bois une binouze à ta santée
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 juin 2010 à 19:41
Ah nan mais ouais y'a pas photo la... via SQL CE ton projet est pondu en 10Mn !


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Rejoignez-nous