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

Contribuez Discussion :

[Article] Bonnes pratiques objet en .net : Introduction aux principes SOLID [News]


Sujet :

Contribuez

  1. #1
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut [Article] Bonnes pratiques objet en .net : Introduction aux principes SOLID
    Dans cet article, je vais essayer de vous présenter les principes SOLID, tels que décrits dans le livre de Robert Martin, en Agile Software Development, Principles, Patterns, and Practices.

    On va voir l'intérêt de ces principes, et comment les appliquer, de façon abordable par tout le monde.

    Accéder à l'article


    N'hésitez pas à laisser vos commentaires à la suite

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 505
    Points : 3 135
    Points
    3 135
    Par défaut
    Bonjour et merci pour cet article très intéressant.
    Je viens d'envoyer le lien à 2 de mes collègues auxquels j'essayais d'expliquer ces principes il y quelques temps.

    Une petite remarque sur le code exemple du chapitre II :

    Les méthodes Save() et GetById() du WorkItemDataAccess ne devrait-elle pas être static ? Je me base là sur la façon que tu as d'appeler ce code ici:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
               public class WorkItemFactory{     
     
                    public void Save(WorkItem item){
                        WorkItemDataAccess.Save(item.Id, item.Name);
                    }
                    public void GetWorkItemById(string id){
                        Datarow dr =  WorkItemDataAccess.GetById(id);
                        if (dr == null){
                            return null;
                        }
                        return new WorkItemData(dr);
                    }
                }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 89
    Points
    89
    Par défaut
    Super article effectivement, qui résume bien la plupart des notions présentés sur d'autres sites. . Au passage j'aime bien la subtile référence au pattern activerecord plébiscité par les puristes RoR et que je trouve à titre personnel, parfaitement dégueulasse.
    Pour répondre à la question de papy214, moi je ne mettrais personnellement pas les méthodes en static. Eventuellement je ferais de la factory un singleton pour éviter d'avoir à l'instancier à chaque fois, mais il me semble pertinent de laisser les méthodes d'instance car :
    -> On peut imaginer que chaque factory hérite d'une interface commune de type ICRUD (pour lui permettre de gérer les opérations d'accès aux données élémentaires). Or il n'est pas possible d'hériter de méthodes statiques.
    -> On peut aussi imaginer une factory de base dont le but est le même

    a+

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 505
    Points : 3 135
    Points
    3 135
    Par défaut
    djflex68 :

    Dans mon message, je ne voulais pas dire qu'il "fallait" dans le sens obligatoire.

    Mais il me semble que la seule manière d'utiliser le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WorkItemDataAccess.Save(item.Id, item.Name);
    est que la méthode WorkItemDataAccess.Save soit une méthode de classe.
    Mais peut-être que quelque chose m'a échappé.

    C'était une simple remarque sur le code, pas sur le fond de l'article que je trouve par ailleurs très intéressant.

  5. #5
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Salut,

    Mais il me semble que la seule manière d'utiliser le code suivant:

    Code :

    WorkItemDataAccess.Save(item.Id, item.Name);

    est que la méthode WorkItemDataAccess.Save soit une méthode de classe.
    Mais peut-être que quelque chose m'a échappé.
    Non, non, bien vu

    Comme quoi, malgré toute l'attention qu'on peut y porter et les relectures successives, il reste toujours des coquilles

    Je vais essayer de le modifier dans la journée (pas accès au kit pour le moment)

    Et merci des appréciations

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Points : 89
    Points
    89
    Par défaut
    Ah ok autant pour moi...
    je ne pensais pas que tu faisais référence à
    WorkItemDataAccess.Save(item.Id, item.Name);
    mais plutôt à :
    public void Save(WorkItem item)
    On est donc d'accord sur le fond

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    merci pour l'article

    Si je peux me permettre:

    Premier cadre de code:
    cmd.CommandTex = "SELECT Id, Name FROM WorkItem where Id = '" + id + "'";
    CommandTex à la place de CommandText

    Et tu dis que tu passes sur le couplage mais c'est pas beaucoup plus long de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd.CommandText = "SELECT Id, Name FROM WorkItem where Id = @Id";
    cmd.Parameters.AddWithValue("Id", id);
    qui est quand même plus jolie

    Deuxième cadre: manque le T aussi +
    return new WorkItemData(dr);
    au lieu de
    return new WorkItem(dr);

    Voilà rien vu d'autre.

  8. #8
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Ca y'est, j'ai mis a jour le document

    @tehcyse, j'ai corrige les t manquants (je vais copier 100 fois "je n'ecrirais plus d'articles dans le train a 6h du mat'" )

    Par contre, je n'ai pas change la requête en requête paramétrée...pourquoi ? juste parce que j'ai peur que ca brouille un peu les pistes (je sais, excuse a 2 frcs.), mais dans l'absolu, je ne ferais même pas :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     SqlConnection cnx = new SqlConnection(ConfigurationManager.ConnectionStrings["database"]);
    cnx.Open();
     
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cnx;
    cmd.CommandText = "SELECT Id, Name FROM WorkItem where Id = '" + id + "'";
     
    DataTable dt = new DataTable();
    using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
      da.Fill(dt);
    }
     
    return dt.Rows.Count == 0 ? null : dt.Rows[0];

    Mais plutôt:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IList<SqlParameter> parameters = new List<SqlParameter>();
    parameters.Add(new SqlParameter("@Id", id));
     
    string strSql = "SELECT Id, Name FROM WorkItem where Id = @id";
     
    DataTable dt = DataBaseHelper.GetDataTable(strSql, parameters)
     
    return dt.Rows.Count == 0 ? null : dt.Rows[0];

    Par exemple...

    Voire un GetDataRow au lie de GetDataTable, ou autre

  9. #9
    Membre régulier Avatar de mitnick2006
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 163
    Points : 106
    Points
    106
    Par défaut
    salut,
    un article très intéressant pour bien appliquer les principales bonnes pratiques en DotNet, juste une petite remarque dans la partie ISP: Interface Segregation Principle, V - C. Exemple, je pense que le code suivant correspond à une interface pas une classe ?!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class IWorkItem {
    ...
        bool IsDeadLineExceeded();
    }
    et merci en avance

  10. #10
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Salut,

    Citation Envoyé par mitnick2006 Voir le message
    salut,
    un article très intéressant pour bien appliquer les principales bonnes pratiques en DotNet, juste une petite remarque dans la partie ISP: Interface Segregation Principle, V - C. Exemple, je pense que le code suivant correspond à une interface pas une classe ?!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class IWorkItem {
    ...
        bool IsDeadLineExceeded();
    }
    et merci en avance
    oops, j'ai oublié un public devant bool


    Faut que je pense à modifier

  11. #11
    Membre régulier Avatar de mitnick2006
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 163
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Philippe Vialatte Voir le message
    Salut,
    oops, j'ai oublié un public devant bool


    Faut que je pense à modifier
    mais est ce que c'est une classe ou bien une interface? car dans les différents exemples que vous avez cités IWorkItem est une interface !

  12. #12
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    bah oops 2, alors, j'étais pas réveillé cet aprèm.

    c'est effectivement une interface, et corrigé

  13. #13
    Membre régulier Avatar de mitnick2006
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 163
    Points : 106
    Points
    106
    Par défaut
    ok merci, maintenant c'est claire

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 198
    Points : 106
    Points
    106
    Par défaut
    C'est peut-être hors-sujet mais ce ne sont pas également de bonnes pratiques pour d'autre langage OO, tel que C++ ?
    Ou tout simplement pour tout langage OO.

  15. #15
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par AsPrO Voir le message
    C'est peut-être hors-sujet mais ce ne sont pas également de bonnes pratiques pour d'autre langage OO, tel que C++ ?
    Ou tout simplement pour tout langage OO.
    Si, bien sur, ce sont des pratiques mutualisables a tous les langages OO, c'est juste qu'étant plus orienté .Net, les exemples sont dans ce langage

    D'ou d'ailleurs le placement dans la rubrique conception

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 198
    Points : 106
    Points
    106
    Par défaut
    Je n'ai pas encore tout lu mais je te fais part des deux fautes de frappes que j'ai remarqué dans la version pdf.

    III - C - Exemple : apres le 2e cadre de code " à caque création d'un nouveau..."

    IV - B - Comment l'appliquer : debut 2e paragraphe " il faut le valider pout tous les clients"

    Sinon, super bon résumé. Le fait que parfois tu ne veuilles pas rentrer trop dans les détails est par moment assez frustrant mais ca donne une bonne vue d'ensemble. Peut-être un jour tu les approfondiras un par un ? :p

  17. #17
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par AsPrO Voir le message
    III - C - Exemple : apres le 2e cadre de code " à caque création d'un nouveau..."

    IV - B - Comment l'appliquer : debut 2e paragraphe " il faut le valider pout tous les clients"
    Va falloir que je corrige

    Sinon, super bon résumé. Le fait que parfois tu ne veuilles pas rentrer trop dans les détails est par moment assez frustrant mais ca donne une bonne vue d'ensemble. Peut-être un jour tu les approfondiras un par un ? :p
    Si j'ai le temps

    enfin, j'ai deja fait un gros bout (specifique .net) sur l'injection de dependances

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 127
    Points
    127
    Par défaut Contresens sur la traduction au niveau de la substitution de Liskov
    Bonjour,

    Il me semble qu'il y a un contresens au niveau de la traduction de la phrase de Robert C. Martin sur la substitution de Liskov :
    "Les sous-types doivent être remplaçables par leur type de base."
    C'est peut-être dû à une petite erreur de traduction mais la phrase devrait plutôt ressembler à "Les sous-types doivent être substituables à leur type de base". Car sinon, cela contredit la traduction de la phrase de Barbara Liskov au-dessus, ainsi que votre explication, très bonne au demeurant, au-dessous.

    Ce que dit Liskov c'est bien que S est un sous-type de T seulement si quand on attend un T on peut passer un S sans que cela ne change le comportement du programme et pas l'inverse : on ne veut pas remplacer S par T.

    Ceci étant dit, merci pour votre travail, très bon article

  19. #19
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 231
    Points : 85 299
    Points
    85 299
    Billets dans le blog
    15
    Par défaut
    Salut,

    Citation Envoyé par Shade Voir le message
    la phrase devrait plutôt ressembler à "Les sous-types doivent être substituables à leur type de base". Car sinon, cela contredit la traduction de la phrase de Barbara Liskov au-dessus, ainsi que votre explication, très bonne au demeurant, au-dessous.
    Cela a été corrigé.

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/09/2013, 18h34
  2. [Article] Bonnes pratiques objet en .net : Introduction aux principes SOLID
    Par Philippe Vialatte dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 25/02/2009, 18h47

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