IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Relations entre objets


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Relations entre objets
    Salut à toutes et à tous,

    Je cherche à créer 2 types d'objets que je dois mettre en relation, mais je crains de créer une sorte d'imbrication infinie.
    Malgré mes recherches je ne trouve pas la solution. Sans doute est-ce ma recherche qui est biaisée, mais je ne vois pas comment chercher autrement.
    Je vous pose donc la question :

    Soit un objet Personne et un objet Matériel. Mon but recherché n'est pas une gestion de véhicules, mais pour être clair pour tous, admettons que les Personne soient de chauffeurs, et les Matériel soient des véhicules (voiture, autobus, moto, ...).

    Je veux garder l'historique des Matériel de chaque Personne, mais aussi l'historique qui a utilisé chaque Matériel.

    Au départ, je me suis dit que dans chaque Matériel je mettre une liste de l'historique avec l'objet Personne, la date de prise et de remise. Dans Personne je ferais la même chose avec une liste de Matériel.
    C'est là que je me dis que je vais tourner en rond. Si je met l'objet Matériel dans la liste de Personne, tout l'objet est importé. Dans Matériel, il y aura aussi la Personne, qui elle contient le Matériel, qui lui contient la Personne, etc ...

    Quelle serait la meilleure méthode selon vous ? Faudrait-il créer un 3ème objet qui contiendrait la date du "transfert" de matériel, la Personne et le Matériel, ou existe-t-il une méthode plus efficace ?
    J'aimerais éviter de passer par une bdd si possible.

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Il faut que tu penses "instances" et non "données".

    En effet, si tu travailles en instances, lors des relations, tu ne fais un pas new Object(), mais directement une attribution de pointeur vers l'instance.
    Et par conséquent, pas de problème de quantité de mémoire ou de boucle infinie.

    Par exemple :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    class Person
    {
        List<Materiel> Materiels = new List<Materiel>();
        string Name { get; set; }
     
        public Person(string name)
        {
              Name = name;
        }
     
        public void UseMateriel(Materiel m)
        {
              if (!Materiels.Contains(m))
              {
                  Materiels.Add(m);
                  m.UsedByPerson(this);
              }
        }
     
        public void Show()
        {
            Show(0);
        }
     
        public void Show(int level)
        {
            if (level < 3)
            {
                Console.WriteLine("{0}Person : {1}", new String('\t', level), Name);
                foreach (Materiel m in Materiels)
                {
                      m.Show(level + 1);
                }
            }
        }
    }
     
    class Materiel
    {
        List<Person> Persons = new List<Person>();
        string Name { get; set; }
     
        public Materiel(string name)
        {
              Name = name;
        }
     
        public void UsedByPerson(Person p)
        {
              if (!Persons.Contains(p))
              {
                  Persons.Add(p);
                  p.UseMateriel(this);
              }
        }
     
        public void Show()
        {
            Show(0);
        }
     
        public void Show(int level)
        {
            if (level < 3)
            {
                Console.WriteLine("{0}Materiel : {1}", new String('\t', level), Name);
                foreach (Person p in Persons)
                {
                      p.Show(level + 1);
                }
            }
        }
    }
     
    // Le programme
    Person p1 = new Person("Toto");
    Person p2 = new Person("Titi");
     
    Materiel m1 = new Materiel("Voiture 1");
    Materiel m2 = new Materiel("Voiture 2");
     
    p1.UseMateriel(m1);
    p2.UseMateriel(m1);
    p2.UseMateriel(m2);
     
    p1.Show();
    p2.Show();

    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Person : Toto
            Materiel : Voiture 1
                    Person : Toto
                    Person : Titi
    Person : Titi
            Materiel : Voiture 1
                    Person : Toto
                    Person : Titi
            Materiel : Voiture 2
                    Person : Titi
    Et il n'y a que 4 instantes d'objets en tout (p1, p2 et m1, m2).
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci StringBuilder. C'était ce que j'avais commencé à coder. J'étais donc dans le bon chemin.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclusion d'objet - Relation entre objet
    Par ejl07 dans le forum Hibernate
    Réponses: 0
    Dernier message: 25/07/2009, 18h53
  2. Portées des propriétés-Relations entre objets
    Par Marmounet dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 25/09/2008, 10h40
  3. Réponses: 6
    Dernier message: 18/02/2008, 23h24
  4. Relation entre objets rollback et buffer cach
    Par Mehdilis dans le forum Oracle
    Réponses: 1
    Dernier message: 04/09/2006, 08h33
  5. [iBATIS] Relations entre objets
    Par Tourix dans le forum Persistance des données
    Réponses: 8
    Dernier message: 25/08/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo