Forum Programmation.c# Pattern Active Record ou ...

Posté par . Licence CC by-sa
Tags :
1
28
jan.
2013

Bonjour à tous,

Je programme depuis un temps certain et j'aurai aimé savoir votre avis sur cette question :

    public class Alert 
    {
       public var id, champ2;

       public int Insert()
       {
         DB('Insert into alert values(id, champ2)');
       }

       public int Update()
       {
         DB('Update alert set ch2 = champ2 where id = id');
       }

       public int Delete()
       {
         DB('DELETE FROM WHERE id = id');
       }
    }

    public static Database
    {
       public static int Save(object obj)
       {
         DB('Insert into alert values(obj.id, obj.champ2)');
       }

       public static int Update(object obj)
       {
         DB('Update alert set ch2 = obj.champ2 where id = obj.id');
       }

       public static int Delete(object obj)
       {
         DB('DELETE FROM alert WHERE id = obj.id');
       }
    }

Ce qui donne à l'utilisation :

Le premier :

Alert alt = new Alert();
alt.id = 123;
alt.champ2 = 'lalala'
alt.insert() ou alt.update() ou alt.delete()

Le deuxième cas :

Alert alt = new Alert();
alt.id = 123;
alt.champ2 = 'lalala'

Database.Save(alt);
Database.Update(alt);
Database.Delete(alt);

Lequel des deux préferez-vous ?

Sachant que dans le deuxième cas il y a une référence qui restera pendant tout le cycle de vie de l'application ..

  • # Les deux sont valides

    Posté par . Évalué à 1.

    Les deux reponses sont valides, ca depend de qui des classes Alert et Database a le plus d'importance.

    Reponse 1: je manipule un objet Alert que je sauvegarde dans la base de donnee Database (hibernation).
    Reponse 2: je manipule une base de donnee Database dans laquelle je sauvegarde des objets Alert.

  • # Injection de dépendance

    Posté par (page perso) . Évalué à 4.

    La première façon a pour défaut que ton objet gère lui-même sa sauvegarde. Si tu veux facilement changer la façon dont il est persité, il faudra modifier sa classe.

    La deuxième façon retire l'aspect sympa de demander à l'objet de se sauvegarder.

    Il y a une autre alternative via l'injection de dépendance.
    En gros tu passes au constructeur de ton objet ou à ses méthodes un objet qui implémente l'interface de IDatabase qui fournit les méthodes necessaires pour la sauvegarde de l'objet Alert. Ainsi, tu peux changer facilement la base de données à utiliser sans recompiler.

    Ca donnerait un truc du genre :

    IDatabase db = SqliteDatabase(conf) ;
    Alert alert = new Alert() ;
    alert.save(db) ;
    alert.delete(db) ;

    Cherches "injection de dépendance" et "inversion de contrôle" sur ton moteur préféré.
    A noter que je ne suis pas un expert et que même si je trouve les design patterns souvent très jolis sur le papier, je n'ai pas encore les automatismes pour les appliquer à du code réel.

    L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.