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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Présentation des principes SOLID appliqués au langage C#
Par Philippe Vialatte

Le , par Philippe Vialatte

6PARTAGES

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

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de Malick
Community Manager https://www.developpez.com
Le 03/09/2019 à 1:02
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é.
2  0 
Avatar de Papy214
Membre émérite https://www.developpez.com
Le 02/03/2009 à 10:34
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
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); 
                } 
            }
0  0 
Avatar de djflex68
Membre régulier https://www.developpez.com
Le 03/03/2009 à 8:31
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+
0  0 
Avatar de Papy214
Membre émérite https://www.developpez.com
Le 03/03/2009 à 9:47
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
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.
0  0 
Avatar de Philippe Vialatte
Expert éminent sénior https://www.developpez.com
Le 03/03/2009 à 10:58
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
0  0 
Avatar de djflex68
Membre régulier https://www.developpez.com
Le 03/03/2009 à 11:14
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
0  0 
Avatar de tehcyse
Membre à l'essai https://www.developpez.com
Le 04/03/2009 à 20:24
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
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.
0  0 
Avatar de Philippe Vialatte
Expert éminent sénior https://www.developpez.com
Le 05/03/2009 à 12:31
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
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
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
0  0 
Avatar de mitnick2006
Membre régulier https://www.developpez.com
Le 29/03/2010 à 17:25
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
1
2
3
4
5
public class IWorkItem {
...
    bool IsDeadLineExceeded();
}

et merci en avance
0  0 
Avatar de Philippe Vialatte
Expert éminent sénior https://www.developpez.com
Le 29/03/2010 à 17:44
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
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
0  0