Précédent   Forum du club des développeurs et IT Pro > Général Développement > ALM > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, sources,...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 25/02/2009, 17h47   #1
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/03/2009, 10h34   #2
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
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# :
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);
                }
            }
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2009, 08h31   #3
djflex68
Membre du Club
 
Inscription : octobre 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2004
Messages : 124
Points : 58
Points : 58
Envoyer un message via MSN à djflex68
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+
djflex68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2009, 09h47   #4
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
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 :
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.
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2009, 10h58   #5
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
Salut,

Citation:
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2009, 11h14   #6
djflex68
Membre du Club
 
Inscription : octobre 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2004
Messages : 124
Points : 58
Points : 58
Envoyer un message via MSN à djflex68
Ah ok autant pour moi...
je ne pensais pas que tu faisais référence à
Citation:
WorkItemDataAccess.Save(item.Id, item.Name);
mais plutôt à :
Citation:
public void Save(WorkItem item)
On est donc d'accord sur le fond
djflex68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2009, 20h24   #7
tehcyse
Invité régulier
 
Inscription : septembre 2006
Messages : 11
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Belgique

Informations forums :
Inscription : septembre 2006
Messages : 11
Points : 7
Points : 7
merci pour l'article

Si je peux me permettre:

Premier cadre de code:
Citation:
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 :
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 +
Citation:
return new WorkItemData(dr);
au lieu de
Citation:
return new WorkItem(dr);

Voilà rien vu d'autre.
tehcyse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2009, 12h31   #8
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
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# :
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# :
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2010, 17h25   #9
mitnick2006
Membre du Club
 
Avatar de mitnick2006
 
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 163
Détails du profil
Informations personnelles :
Âge : 26

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

Informations forums :
Inscription : décembre 2006
Messages : 163
Points : 63
Points : 63
Envoyer un message via MSN à mitnick2006
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 :
1
2
3
4
5
public class IWorkItem {
...
    bool IsDeadLineExceeded();
}
et merci en avance
__________________
Knoweledge Is Power In Digital World
mitnick2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2010, 17h44   #10
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
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 :
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2010, 17h55   #11
mitnick2006
Membre du Club
 
Avatar de mitnick2006
 
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 163
Détails du profil
Informations personnelles :
Âge : 26

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

Informations forums :
Inscription : décembre 2006
Messages : 163
Points : 63
Points : 63
Envoyer un message via MSN à mitnick2006
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 !
__________________
Knoweledge Is Power In Digital World
mitnick2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2010, 22h12   #12
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
bah oops 2, alors, j'étais pas réveillé cet aprèm.

c'est effectivement une interface, et corrigé
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 11h04   #13
mitnick2006
Membre du Club
 
Avatar de mitnick2006
 
Ingénieur développement logiciels
Inscription : décembre 2006
Messages : 163
Détails du profil
Informations personnelles :
Âge : 26

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

Informations forums :
Inscription : décembre 2006
Messages : 163
Points : 63
Points : 63
Envoyer un message via MSN à mitnick2006
ok merci, maintenant c'est claire
__________________
Knoweledge Is Power In Digital World
mitnick2006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 13h16   #14
AsPrO
Membre du Club
 
Inscription : septembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 183
Points : 51
Points : 51
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.
AsPrO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2010, 14h39   #15
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2010, 11h32   #16
AsPrO
Membre du Club
 
Inscription : septembre 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 183
Points : 51
Points : 51
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
AsPrO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2010, 12h51   #17
Philippe Vialatte
Expert Confirmé Sénior

 
Avatar de Philippe Vialatte
 
Homme Philippe Vialatte
Architecte technique
Inscription : juillet 2004
Messages : 3 051
Détails du profil
Informations personnelles :
Nom : Homme Philippe Vialatte
Âge : 35
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 051
Points : 11 449
Points : 11 449
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

Citation:
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
__________________

Mon Blog

The Cake is still a lie !!!



Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h08.


 
 
 
 
Partenaires

Hébergement Web