REPUBLIQUE ET CANTON DE GENEVE
Département de l’instruction publique, de la culture et du sport
Centre de formation professionnelle technique
Ecole d’informatique
Conventions de codage CSharp
Sujet: Conventions de programmation Csharp
Auteur : Enseignants CFPT-i / Microsoft Date : 22 août 2013
Conventions Csharp Ecole d’Informatique 1 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
Le coût de la conception de logiciels est très élevé. Pour préserver ses investissements, l’entreprise sérieuse édite des règles de codage motivées par les raisons suivantes :
–un logiciel doit en tout temps rester modifiable, adaptable et compréhensible;
–une fonction réalisée doit pouvoir être récupérée sans difficultés pour un nouveau projet;
–l’indisponibilité d’un programmeur ne doit jamais mettre le projet en péril; –des projets réalisés en équipe doivent être cohérents.
Exemple du projet open source WebKit :
Les parties importantes sont expliquées par un organigramme, un diagramme d’état, un structogramme ou du pseudo-code qui peuvent être manuscrits ou réalisés au moyen d’un logiciel spécialisé.
Chaque programme commence par un en-tête qui comprend au minimum les inforsmations suivantes :
–le nom du projet;
–le nom de l’auteur du programme;
–la description générale du projet;
–la date et la référence de la version de base;
–la date et la référence de chaque version avec la description des modifications.
Exemple :
1 | /* | |
2 | * Projet : | NPI Calculatrice |
3 | * Auteur : | GAF |
4 | * Desc. : | Calculatrice (4 opérations), NotationPolonaiseInverse |
5 | * Version: | 1.0, 2012.09.14, GAF, version initiale |
6 | */ |
Les commentaires sont censés aider la personne qui lira votre programme. Ils ne sont pas là pour indiquer ce que le code dit déjà de façon manifeste. « Ne soulignez pas ce qui est évident. »
Il n’est pas utile de commenter chaque ligne, mais il faut fournir les renseignements clés.
Les éléments suivants doivent obligatoirement être commentés :
–les définitions de classes;
–les déclarations de constantes, d’objets et de variables; –les déclarations de méthodes;
–les lignes de code complexes.
1 compteurEspace = compteurEspace + 1; // increment compteur Espace 2 total = nombreRecu; // initialise total avec nombre Recu
Tous les commentaires du listing 2 sont inutiles et devront être supprimés. Ils n’apportent rien à la compréhension du code. Le lecteur lit couramment le langage C#.
Conventions Csharp Ecole d’Informatique 3 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
Chaque méthode possède une documentation. Les renseignements permettent à un programmeur étranger au projet d’utiliser la méthode sans devoir analyser son code.
L’en-tête comprend au moins :
–la description du but de la méthode (ce qu’elle fait); –la description des paramètres d’entrées et de sortie.
Exemple :
1 /* 2 Nom : BeneficeParProduitPeriode 3 Description : Calcule le bénéfice par produit et période 4 Paramètre(s)d’entrée : référence du produit 5 date de début 6 date de fin 7 Paramètre(s) de sortie : bénéfice réalisé 8 */ |
Les noms des identificateurs 1 doivent être auto-explicatifs et rédigés en français.
Le nom des constantes est exprimé entièrement en lettres majuscules en utilisant le caractère souligné pour séparer les mots.
Pour faciliter la compréhension, les identificateurs des objets graphiques générés par Visual Studio doivent être modifiés :
–la numérotation est remplacée par un nom explicite; –le type du contrôle est conservé et doit être abrégé.
Exemple :
1 button1_Click; | // C’est le nom généré par Visual Studio |
2 buttonStartClick; | // Le nom du contrôle plus sa fonction |
3 btnStartClick; | // Abréviation du contrôle plus sa fonction |
Exception : pour des raisons internes à Visual Studio (utilisation du nom de la fiche pour nommer les fichiers), la fiche (Form1) ne sera pas renommée.
3.2.1 Abréviations standards
Il est possible d’abréger les noms des contrôles selon les conventions des tableaux 1(a),
1(b) et 1(c).
Conventions de codage CSharp CFPT-Informatique
Nom du contrôle | Abréviation |
Button | btn |
CheckBox | chk |
CheckedListBox | clb |
ComboBox | cmb |
DateTimePicker | dtp |
Label | lbl |
LinkLabel | llb |
ListBox ![]() | lsb |
ListView | lsv |
MaskTextBox | mtb |
MonthCalendar | mca |
NotifyIcon | nic |
NumericUpDown | nud |
PictureBox | pib |
ProgressBar | prb |
RadioButton | rdb |
RichTextBox | rtb |
TextBox | tbx |
Timer | tmr |
ToolTip | tot |
TreeView | tv |
WebBrowser | web |
Nom du contrôle | Abréviation |
FlowLayoutPanel | flp |
GroupBox | gb |
Panel | pnl |
SplitContainer | sc |
TabControl | tc |
TableLayoutPanel | tlp |
Nom du contrôle | Abréviation |
ContextMenuStrip | cms |
MenuStrip | ms |
StatusStrip | ss |
ToolStrip | ts |
ToolStripContainer | tsc |
ToolStripMenuItem | tsm |
ColorDialog | cd |
FolderBrowserDialog | fbd |
FontDialog | fd |
OpenFileDialog | ofd |
SaveFileDialog | sfd |
Status Bar | stb |
Tableau 3 (c) Conteneurs
Tableau 4 (c) Menus, barres d’outils
Tableau 1 (a) Contrôles communs
Nom du contrôle | Abréviation |
HScrollBar | hsb |
VScrollBar | vsb |
Tableau 2 (b) Autres contrôles
Conventions Csharp Ecole d’Informatique 5 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
Les noms de classes débutent par une majuscule. Ex : Personne
Les noms des objets débutent par une minuscule.
Ex : personne
Les noms des champs privés débutent par le caractère souligné suivi d’une minuscule.
Ex :
private double _taux ;
Les propriétés (en C#) sont les méthodes d’accès aux champs privés (getter /setter).
Les noms des propriétés débutent par une majuscule. Ex :
1 public double Taux {
2 get { return _taux;}
3 set { _taux = value;}
4 }
Les noms des méthodes débutent par une majuscule.
Utilisez des verbes actifs, éventuellement suivis par des noms.
Ex :
|
Voir liste de verbes d’action au paragraphe 6.
Conventions de codage CSharp CFPT-Informatique
1 /* 2 * Projet : 02 3 * Auteur : GAF 4 * Description : Les bases des interfaces , le second projet 5 * Version : 1.0 , 2012.09.14 , GAF , version de base 6 */ 7 8 using.namespace M120 ; 9 { 10 public partial class Form1 : Form 11 { 12 private double _taux ; 13 public double Taux { 14 get { return _taux ; } 15 set { _taux = value; } 16 } 17 18 public Form1 () { 19 InitializeComponent(); 20 } 21 22 private void btnAfficher_Click ( object sender , EventArgs e ) { 23 // on affiche la valeur qui a été saisi dans le TextBox tbxSaisie 24 string texte = (); 28 if (texte.Length != 0) { 29 = Convert.ToDouble(texte); 30 ("Texte saisi = " + .ToSTring (), "Vérification de la saisie ", , MessageBoxIcon.Information); 31 } 32 else { 33 ("Saisissez une valeur ", "Vérification de la saisie", , MessageBoxIcon.Error); 34 } 35 } 36 } |
Le code ne doit contenir aucune valeur numérique à l’exception de 0 et 1. Les autres valeurs sont toutes déclarées sous forme de constantes. Cette méthode facilite la mise à jour et rend les programmes compréhensibles.
Exemple :
1 for ( int i =1; i < 15; ++ i ) 2 { 3 if ( s > 10) 4 { 5 s = 10; 6 } 7 } |
4 défauts :
– la valeur 75 n’est pas auto-documentée ;
– si la valeur 10 doit être changée, il faut faire deux modifications ;
– la valeur 10 n’est pas auto-documentée ;
Conventions Csharp Ecole d’Informatique 7 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
– la variable s n’est pas auto-documentée.
1 const int NB_COLONNES_MAX = 75;
2 cont int COMPOSANTE_ROUGE_MAX = 10;
3
4 for ( int i =1; <= NB_COLONNES_MAX ; ++ i )
5 {
6 if ( seuilCouleurRouge > COMPOSANTE_ROUGE_MAX )
7 {
8 seuilCouleurRouge = COMPOSANTE_ROUGE_MAX ; 9 }
4 avantages :
– la constante NB_COLONNES_MAX est auto-documentée
– le changement de la limite nécessite une seule modification (COMPOSANTE_ROUGE_MAX) ;
– la constante COMPOSANTE_ROUGE_MAX est auto-documentée ; – la variable SeuilCouleurRouge est auto-documentée.
Liste exhaustive :
F5 | démarre le débogage |
SHIFT+F5 | arrête le débogage |
CTRL+F5 | exécute sans débogage |
F6 | génére la solution |
F10/F11 | exécute un pas (principal/détaillé) |
TAB | insére un modèle de code (if, for, foreach,class ) 2xTAB pour un modèle pré-rempli | |
CTRL+SPACE | complète le mot (variable, méthode. . .) | |
CTRL+L | coupe la ligne courante (Line ) | |
SHIFT+ALT+T | déplace la ligne courante vers le bas (Toggle ) | |
SHIFT+ALT+ARROW | sélectionne en mode bloc | |
CTRL+I | recherche incrémentale (Incremental ) | |
CTRL+SHIFT+R | enregistrement d’une macro (Record ) | |
CTRL+SHIFT+P | exécution de la macro enregistrée (Play ) | |
CTRL+. | – recherche le using de la classe – génère le squelette de la méthode – génère les méthodes d’une interface |
Conventions de codage CSharp CFPT-Informatique
CTRL+K, CTRL+F | auto-indente la sélection |
CTRL+K, CTRL+D | auto-indente le fichier |
CTRL+K, CTRL+C | commente un bloc (Comment ) |
CTRL+K, CTRL+U | décommente un bloc (Uncomment ) |
CTRL+K, CTRL+S | entoure la sélection de : #region (Surround ) |
CTRL+K, CTRL+X | insère un snippet |
5.4 Navigation/fenêtre
F7 | affiche la fenêtre de code |
SHIFT+F7 | affiche la fenêtre d’interface graphique ![]() |
CTRL+K, CTRL+K | place/retire un signet (booKmark ) |
CTRL+K, CTRL+N | va au prochain signet (Next ) |
CTRL+K, CTRL+P | va au précédent signet (Previous ) |
CTRL+W, D | affiche la fenêtre de définition de code (classe, structure ) (Definition ) |
CTRL+M, CTRL+M | ouvre/ferme un pli |
CTRL+M, CTRL+O | ferme tous les plis |
Add Approve Assert Backup Block Checkpoint Clear Close Compare Complete Compress | Confirm Connect Convert ConvertFrom ConvertTo Copy Debug Deny Disable Disconnect Dismount | Edit Enable Enter Exit Expand Export Find Format Get Grant Group | Hide Import Initialize Install Invoke Join Limit Lock Measure Merge Mount |
Conventions Csharp Ecole d’Informatique 9 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
Move New Open Out Ping Pop Protect Publish Push Read Receive Redo Register | Remove Rename Repair Request Reset Resolve Restart Restore Resume Revoke Save Search Select | Send Set Show Skip Split Start Step Stop Submit Suspend Switch Sync Test | Trace Unblock Undo Uninstall Unlock Unprotect Unpublish Unregister Update Use Wait Watch Write |
Remarque : ces verbes d’action proviennent de la commande Get-Verb du langage de script de Windows :
PowerShell 2
Voir
AddHandler AddressOf Alias And Ansi As Assembly Auto Base Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr | CType Date Decimal Declare Default Delegate Dim Do Double Each Else ElseIf End Enum Erase Error Event Exit ExternalSourc e False Finalize Finally Float For Friend Function Get GetType Goto Handles | If Implements Imports ![]() In Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing NotInheritabl e NotOverridabl e Object On Option | Optional Or Overloads Overridable Overrides ParamArray Preserve Private Property Protected Public RaiseEvent ReadOnly ReDim Region REM RemoveHandler Resume Return Select Set Shadows Shared Short Single Static Step Stop String Structure Sub | SyncLock Then Throw To True Try TypeOf Unicode Until volatile When While With WithEvents WriteOnly Xor eval extends instanceof package var |
CFPT-Informatique Conventions de codage CSharp
Visual Studio 2010 / 2012
La Spécification du langage C# ne définit aucune norme de codage. Toutefois, les conventions de cette rubrique sont utilisées par Microsoft pour développer des exemples et de la documentation.
Les conventions de codage répondent aux objectifs suivants :
• Elles donnent au code un aspect homogène, afin que les lecteurs puissent se concentrer sur le contenu et non pas sur la disposition.
• Elles permettent aux lecteurs de comprendre le code plus rapidement en faisant des hypothèses selon leur expérience précédente.
• Elles facilitent la copie, la modification et la gestion du code.
• Elles illustrent les meilleures pratiques de C#.
• Dans les exemples courts qui ne comprennent pas de directive using, utilisez les qualifications d'espace de noms. Si vous savez qu'un espace de noms est importé par défaut dans un projet, vous ne devez pas attribuer des noms qualifiés complets de cet espace de noms. Les noms qualifiés peuvent être interrompus par un point (.) s'ils sont trop longs pour une ligne unique, comme indiqué dans l'exemple suivant.
var currentPerformanceCounterCategory = new System.Diagnostics. PerformanceCounterCategory();
• Vous ne devez pas modifier les noms des objets créés à l'aide de les outils du concepteur de Visual Studio pour les rendre conformes d'autres directives.
Une bonne mise en page utilise la mise en forme pour souligner la structure du code et simplifier la lecture du code. Les exemples et échantillons de Microsoft sont conformes aux conventions suivantes :
• Utilisez les paramètres par défaut de l'éditeur de code (mise en retrait intelligente, mise en retrait de quatre caractères, enregistrement des tabulations en tant qu'espaces). Pour plus d'informations, consultez Options, Éditeur de texte, C#, Mise en forme.
• Écrivez une seule instruction par ligne.
• Écrivez une seule déclaration par ligne.
• Si les lignes continuation ne sont pas mises en retrait automatiquement, mettez-les en retrait d'un taquet de tabulation (quatre espaces).
• Laissez au moins une ligne vide entre les définitions de méthode et de propriété.
• Utilisez des parenthèses pour rendre des clauses apparentes dans une expression, comme illustré dans le code suivant.
if ((val1 > val2) && (val1 > val3)) { // Take appropriate action.
}
Conventions Csharp Ecole d’Informatique 11 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy Tél 00 41 22 388 87 28
• Placez le commentaire sur une ligne séparée, pas à la fin d'une ligne de code.
• Commencez le texte du commentaire par une lettre majuscule.
• Ajoutez un point à la fin du texte de commentaire.
• Insérez un espace entre le délimiteur de commentaire (//) et le texte de commentaire, comme indiqué dans l'exemple suivant.
// The following declaration creates a query. It does not run // the query.
• Ne créez pas de blocs d'astérisques mis en forme autour des commentaires.
Les sections suivantes décrivent les pratiques que l'équipe C# suit pour préparer des exemples de code et des échantillons.
• Utilisez l'opérateur + pour concaténer des chaînes courtes, comme indiqué dans le code suivant.
string displayName = nameList[n].LastName + ", " + nameList[n].FirstName;
• Pour ajouter des chaînes dans des boucles, en particulier si vous travaillez avec de grandes quantités de texte, utilisez un objet StringBuilder.
var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala"; var manyPhrases = new StringBuilder(); for (var i = 0; i < 10000; i++) { manyPhrases.Append(phrase);
} //Console.WriteLine("tra" + manyPhrases);
• Utilisez les types implicites pour les variables locales lorsque le type de la variable apparaît à droite de l'instruction, ou lorsque le type précis n'est pas important.
// When the type of a variable is clear from the context, use var // in the declaration. var var1 = "This is clearly a string."; var var2 = 27; var var3 = Convert.ToInt32(Console.ReadLine()); |
• N'utilisez pas var lorsque le type n'apparaît pas à droite de l'instruction.
// When the type of a variable is not clear from the context, use an // explicit type. int var4 = ExampleClass.ResultSoFar(); |
• N'utilisez pas le nom de la variable pour indiquer le type de la variable. Il n'est peut-être pas correct.
// Naming the following variable inputInt is misleading. // It is a string. var inputInt = Console.ReadLine(); Console.WriteLine(inputInt); |
• Évitez d'utiliser var à la place de dynamique.
• Utilisez les types implicites pour déterminer le type des boucles de variable de boucle dans les boucles for et foreach.
Conventions de codage CSharp CFPT-Informatique
L'exemple suivant utilise les types implicites dans une instruction for.
var syllable = "ha"; var laugh = ""; for (var i = 0; i < 10; i++) { laugh += syllable; Console.WriteLine(laugh); } |
L'exemple suivant utilise les types implicites dans une instruction foreach.
foreach (var ch in laugh) { if (ch == 'h') Console.Write("H"); else
Console.Write(ch);
}
Console.WriteLine();
• En général, utilisez int plutôt que des types non signés. L'utilisation de int est commune dans tout le langage C#, et il est plus facile d'interagir avec d'autres bibliothèques lorsque vous utilisez int.
• Utilisez la syntaxe concise lorsque vous initialisez des tableaux sur la ligne de déclaration.
// Preferred syntax. Note that you cannot use var here instead of string[]. string[] vowels1 = { "a", "e", "i", "o", "u" }; // If you use explicit instantiation, you can use var. var vowels2 = new string[] { "a", "e", "i", "o", "u" }; ![]() // If you specify an array size, you must initialize the elements one at a time. var vowels3 = new string[5]; vowels3[0] = "a"; vowels3[1] = "e"; // And so on. |
• Utilisez la syntaxe concise pour créer des instances d'un type délégué.
// First, in class Program, define the delegate type and a method that // has a matching signature. // Define the type. public delegate void Del(string message); // Define a method that has a matching signature. public static void DelMethod(string str) { Console.WriteLine("DelMethod argument: {0}", str); } |
// In the Main method, create an instance of Del. // Preferred: Create an instance of Del by using condensed syntax. Del exampleDel2 = DelMethod; // The following declaration uses the full syntax. Del exampleDel1 = new Del(DelMethod); |
Conventions Csharp 13 / 16
• Utilisez une instruction try-catch pour la gestion de la plupart des exceptions.
static string GetValueFromArray(string[] array, int index) { try { return array[index]; } catch (System.IndexOutOfRangeException ex) { Console.WriteLine("Index is out of range: {0}", index); throw; } } |
• Simplifiez votre code à l'aide de l'instruction using du langage C#. Si vous avez une instruction tryfinally dans laquelle le seul code dans le bloc finally est un appel à la méthode Dispose, utilisez une instruction using à la place.
// This try-finally statement only calls Dispose in the finally block. Font font1 = new Font("Arial", 10.0f); try { byte charset = font1.GdiCharSet; } finally { if (font1 != null) { ((IDisposable)font1).Dispose(); } } // You can do the same thing with a using statement. using (Font font2 = new Font("Arial", 10.0f)) { byte charset = font2.GdiCharSet; } |
• Pour éviter les exceptions et améliorer les performances en ignorant les comparaisons inutiles, utilisez && au lieu de & et || au lieu de | lorsque vous effectuez des comparaisons, comme indiqué dans l'exemple suivant.
Console.Write("Enter a dividend: "); var dividend = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter a divisor: "); var divisor = Convert.ToInt32(Console.ReadLine()); // If the divisor is 0, the second clause in the following condition // causes a run-time error. The && operator short circuits when the // first expression is false. That is, it does not evaluate the // second expression. The & operator evaluates both, and causes // a run-time error when divisor is 0. if ((divisor != 0) && (dividend / divisor > 0)) { Console.WriteLine("Quotient: {0}", dividend / divisor); } else { Console.WriteLine("Attempted division by 0 ends up here."); } |
Conventions de codage CSharp CFPT-Informatique
• Utilisez le formulaire concis d'instanciation d'objets, avec des types implicites, comme indiqué dans la déclaration suivante.
var instance1 = new ExampleClass();
La ligne précédente est équivalente à la déclaration suivante.
ExampleClass instance2 = new ExampleClass();
• Utilisez des initialiseurs d'objets pour simplifier la création d'objets.
// Object initializer. var instance3 = new ExampleClass { Name = "Desktop", ID = 37414, Location = "Redmond", Age = 2.3 }; // Default constructor and assignment statements. var instance4 = new ExampleClass(); = "Desktop"; = 37414; instance4.Location = "Redmond"; = 2.3; |
• Si vous définissez un gestionnaire d'événements que vous n'avez pas besoin de supprimer ultérieurement, utilisez une expression lambda.
public Form2() { // You can use a lambda expression to define an event handler. this.Click += (s, e) => { ( ((MouseEventArgs)e).Location.ToString()); }; } |
// Using a lambda expression shortens the following traditional definition. public Form1() { this.Click += new EventHandler(Form1_Click); } void Form1_Click(object sender, EventArgs e) { (((MouseEventArgs)e).Location.ToString()); } |
• Appelez des membres statiques à l'aide du nom de la classe : ClassName.StaticMember.
N'accédez pas à un membre statique qui est défini dans une classe de base d'une classe dérivée.
Conventions Csharp 15 / 16
• Utilisez des noms explicites pour les variables de requête. L'exemple suivant utilise seattleCustomers pour des clients qui se trouvent à Seattle.
var seattleCustomers = from cust in customers where == "Seattle" select ;
• Utilisez des alias pour vous assurer que les noms de propriété des types anonymes sont correctement capitalisés à l'aide de la casse Pascal.
var localDistributors = from customer in customers join distributor in distributors on equals select new { Customer = customer, Distributor = distributor }; |
• Renommez les propriétés lorsque les noms de propriété dans le résultat sont ambigus. Par exemple, si votre requête retourne un nom de client et un ID du serveur de distribution, au lieu de les laisser en tant que Name et ID dans le résultat, renommez-les pour clarifier que Name correspond au nom d'un client, et que ID désigne l'ID du serveur de distribution.
var localDistributors2 = from cust in customers join dist in distributors on equals select new { CustomerName = , DistributorID = }; |
• Utilisez les types implicites dans la déclaration des variables de requête et de portée.
var seattleCustomers = from cust in customers where == "Seattle" select ;
• Alignez les clauses de requête sous la clause de , comme indiqué dans les exemples précédents.
• Utilisez les clauses where avant les autres clauses de requête afin de vous assurer que les clauses de requête ultérieures s'appliquent correctement au groupe de données réduit et filtré.
var seattleCustomers2 = from cust in customers where == "Seattle" orderby select cust;
• Utilisez plusieurs clauses from au lieu d'une clause join pour accéder aux collections internes. Par exemple, chaque élément d'une collection d'objets Student peut contenir une collection de notes d'examens. Lorsque la requête suivante est exécutée, elle retourne chaque note qui est supérieure à 90, avec le nom de l'étudiant qui l'a reçue.
// Use a compound from to access the inner sequence within each element. var scoreQuery = from student in students from score in student.Scores where score > 90
select new { Last = student.LastName, score };
© 2013 Microsoft. Tous droits réservés.
REPUBLIQUE ET CANTON DE GENEVE
Département de l’instruction publique, de la culture et du sport
Centre de formation professionnelle technique
Ecole d’informatique
Conventions de codage CSharp
Sujet: Conventions de programmation Csharp
Auteur : Enseignants CFPT-i / Microsoft Date : 22 août 2013
Conventions Csharp Ecole d’Informatique 1 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
Le coût de la conception de logiciels est très élevé. Pour préserver ses investissements, l’entreprise sérieuse édite des règles de codage motivées par les raisons suivantes :
–un logiciel doit en tout temps rester modifiable, adaptable et compréhensible;
–une fonction réalisée doit pouvoir être récupérée sans difficultés pour un nouveau projet;
–l’indisponibilité d’un programmeur ne doit jamais mettre le projet en péril; –des projets réalisés en équipe doivent être cohérents.
Exemple du projet open source WebKit :
Les parties importantes sont expliquées par un organigramme, un diagramme d’état, un structogramme ou du pseudo-code qui peuvent être manuscrits ou réalisés au moyen d’un logiciel spécialisé.
Chaque programme commence par un en-tête qui comprend au minimum les inforsmations suivantes :
–le nom du projet;
–le nom de l’auteur du programme;
–la description générale du projet;
–la date et la référence de la version de base;
–la date et la référence de chaque version avec la description des modifications.
Exemple :
1 | /* | |
2 | * Projet : | NPI Calculatrice |
3 | * Auteur : | GAF |
4 | * Desc. : | Calculatrice (4 opérations), NotationPolonaiseInverse |
5 | * Version: | 1.0, 2012.09.14, GAF, version initiale |
6 | */ |
Les commentaires sont censés aider la personne qui lira votre programme. Ils ne sont pas là pour indiquer ce que le code dit déjà de façon manifeste. « Ne soulignez pas ce qui est évident. »
Il n’est pas utile de commenter chaque ligne, mais il faut fournir les renseignements clés.
Les éléments suivants doivent obligatoirement être commentés :
–les définitions de classes;
–les déclarations de constantes, d’objets et de variables; –les déclarations de méthodes;
–les lignes de code complexes.
1 compteurEspace = compteurEspace + 1; // increment compteur Espace 2 total = nombreRecu; // initialise total avec nombre Recu
Tous les commentaires du listing 2 sont inutiles et devront être supprimés. Ils n’apportent rien à la compréhension du code. Le lecteur lit couramment le langage C#.
Conventions Csharp Ecole d’Informatique 3 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
Chaque méthode possède une documentation. Les renseignements permettent à un programmeur étranger au projet d’utiliser la méthode sans devoir analyser son code.
L’en-tête comprend au moins :
–la description du but de la méthode (ce qu’elle fait); –la description des paramètres d’entrées et de sortie.
Exemple :
1 /* 2 Nom : BeneficeParProduitPeriode 3 Description : Calcule le bénéfice par produit et période 4 Paramètre(s)d’entrée : référence du produit 5 date de début 6 date de fin 7 Paramètre(s) de sortie : bénéfice réalisé 8 */ |
Les noms des identificateurs 1 doivent être auto-explicatifs et rédigés en français.
Le nom des constantes est exprimé entièrement en lettres majuscules en utilisant le caractère souligné pour séparer les mots.
Pour faciliter la compréhension, les identificateurs des objets graphiques générés par Visual Studio doivent être modifiés :
–la numérotation est remplacée par un nom explicite; –le type du contrôle est conservé et doit être abrégé.
Exemple :
1 button1_Click; | // C’est le nom généré par Visual Studio |
2 buttonStartClick; | // Le nom du contrôle plus sa fonction |
3 btnStartClick; |
Exception : pour des raisons internes à Visual Studio (utilisation du nom de la fiche pour nommer les fichiers), la fiche (Form1) ne sera pas renommée.
3.2.1 Abréviations standards
Il est possible d’abréger les noms des contrôles selon les conventions des tableaux 1(a),
1(b) et 1(c).
Conventions de codage CSharp CFPT-Informatique
Nom du contrôle | Abréviation |
Button | btn |
CheckBox | chk |
CheckedListBox | clb |
ComboBox | cmb |
DateTimePicker | dtp |
Label | lbl |
LinkLabel | llb |
ListBox | lsb |
ListView | lsv |
MaskTextBox | mtb |
MonthCalendar | mca |
NotifyIcon | nic |
NumericUpDown | nud |
PictureBox | pib |
ProgressBar | prb |
RadioButton | rdb |
RichTextBox | rtb |
TextBox | tbx |
Timer | tmr |
ToolTip | tot |
TreeView | tv |
WebBrowser | web |
Nom du contrôle | Abréviation |
FlowLayoutPanel | flp |
GroupBox | gb |
Panel | pnl |
SplitContainer | sc |
TabControl | tc |
TableLayoutPanel | tlp |
Nom du contrôle | Abréviation |
ContextMenuStrip | cms |
MenuStrip | ms |
StatusStrip | ss |
ToolStrip | ts |
ToolStripContainer | tsc |
ToolStripMenuItem | tsm |
ColorDialog | cd |
FolderBrowserDialog | fbd |
FontDialog | fd |
OpenFileDialog | ofd |
SaveFileDialog | sfd |
Status Bar | stb |
Tableau 3 (c) Conteneurs
Tableau 4 (c) Menus, barres d’outils
Tableau 1 (a) Contrôles communs
Nom du contrôle | Abréviation |
HScrollBar | |
VScrollBar | vsb |
Tableau 2 (b) Autres contrôles
Conventions Csharp Ecole d’Informatique 5 / 16
10, Gérard-de-Ternier
1213 Petit-Lancy Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
Les noms de classes débutent par une majuscule. Ex : Personne
Les noms des objets débutent par une minuscule.
Ex : personne
Les noms des champs privés débutent par le caractère souligné suivi d’une minuscule.
Ex :
private double _taux ;
Les propriétés (en C#) sont les méthodes d’accès aux champs privés (getter /setter).
Les noms des propriétés débutent par une majuscule. Ex :
1 public double Taux {
2 get { return _taux;}
3 set { _taux = value;}
4 }
Les noms des méthodes débutent par une majuscule.
Utilisez des verbes actifs, éventuellement suivis par des noms.
Ex :
|
Voir liste de verbes d’action au paragraphe 6.
1 /* 2 * Projet : 02 3 * Auteur : GAF 4 * Description : Les bases des interfaces , le second projet 5 * Version : 1.0 , 2012.09.14 , GAF , version de base 6 */ 7 8 using.namespace M120 ; 9 { 10 public partial class Form1 : Form 11 { 12 private double _taux ; 13 public double Taux { 14 get { return _taux ; } 15 set { _taux = value; } 16 } 17 18 public Form1 () { 19 InitializeComponent(); 20 } 21 22 private void btnAfficher_Click ( object sender , EventArgs e ) { 23 // on affiche la valeur qui a été saisi dans le TextBox tbxSaisie 24 string texte = (); 28 if (texte.Length != 0) { 29 = Convert.ToDouble(texte); 30 ("Texte saisi = " + .ToSTring (), "Vérification de la saisie ", , MessageBoxIcon.Information); 31 } 32 else { 33 ("Saisissez une valeur ", "Vérification de la saisie", , MessageBoxIcon.Error); 34 } 35 } 36 } |
Le code ne doit contenir aucune valeur numérique à l’exception de 0 et 1. Les autres valeurs sont toutes déclarées sous forme de constantes. Cette méthode facilite la mise à jour et rend les programmes compréhensibles.
Exemple :
1 for ( int i =1; i < 15; ++ i ) 2 { 3 if ( s > 10) 4 { 5 s = 10; 6 } 7 } |
4 défauts :
– la valeur 75 n’est pas auto-documentée ;
– si la valeur 10 doit être changée, il faut faire deux modifications ;
– la valeur 10 n’est pas auto-documentée ;
10, Gérard-de-Ternier
1213 Petit-Lancy
Tél 00 41 22 388 87 28
CFPT-Informatique Conventions de codage CSharp
– la variable s n’est pas auto-documentée.
1 const int NB_COLONNES_MAX = 75;
2 cont int COMPOSANTE_ROUGE_MAX = 10;
3
4 for ( int i =1; <= NB_COLONNES_MAX ; ++ i )
5 {
6 if ( seuilCouleurRouge > COMPOSANTE_ROUGE_MAX )
7 {
8 seuilCouleurRouge = COMPOSANTE_ROUGE_MAX ; 9 }
4 avantages :
– la constante NB_COLONNES_MAX est auto-documentée
– le changement de la limite nécessite une seule modification (COMPOSANTE_ROUGE_MAX) ;
– la constante COMPOSANTE_ROUGE_MAX est auto-documentée ; – la variable SeuilCouleurRouge est auto-documentée.
Liste exhaustive :
F5 | démarre le débogage |
SHIFT+F5 | arrête le débogage |
CTRL+F5 | exécute sans débogage |
F6 | génére la solution |
F10/F11 | exécute un pas (principal/détaillé) |
TAB | insére un modèle de code (if, for, foreach,class ) 2xTAB pour un modèle pré-rempli | |
CTRL+SPACE | complète le mot (variable, méthode. . .) | |
CTRL+L | coupe la ligne courante (Line ) | déplace la ligne courante vers le bas (Toggle ) |
SHIFT+ALT+ARROW | sélectionne en mode bloc | |
CTRL+I | recherche incrémentale (Incremental ) | |
CTRL+SHIFT+R | enregistrement d’une macro (Record ) | |
CTRL+SHIFT+P | exécution de la macro enregistrée (Play ) | |
CTRL+. | – recherche le using de la classe – génère le squelette de la méthode – génère les méthodes d’une interface |
Conventions de codage CSharp CFPT-Informatique
CTRL+K, CTRL+F | auto-indente la sélection |
CTRL+K, CTRL+D | auto-indente le fichier |
CTRL+K, CTRL+C | commente un bloc (Comment ) |
CTRL+K, CTRL+U | décommente un bloc (Uncomment ) |
CTRL+K, CTRL+S | entoure la sélection de : #region (Surround ) |
CTRL+K, CTRL+X | insère un snippet |
5.4 Navigation/fenêtre
F7 | affiche la fenêtre de code |
SHIFT+F7 | affiche la fenêtre d’interface graphique |
CTRL+K, CTRL+K | place/retire un signet (booKmark ) |
CTRL+K, CTRL+N | va au prochain signet (Next ) |
CTRL+K, CTRL+P | va au précédent signet (Previous ) |
CTRL+W, D | affiche la fenêtre de définition de code (classe, structure ) (Definition ) |
CTRL+M, CTRL+M | ouvre/ferme un pli |
CTRL+M, CTRL+O | ferme tous les plis |
Add Approve Assert Backup Block Checkpoint Clear Close Compare Complete Compress | Confirm Connect Convert ConvertFrom ConvertTo Copy Debug Deny Disable Disconnect Dismount | Edit Enable Enter Exit Expand Export Find Format Get Grant Group | Hide Import Initialize Install Invoke Join Limit Lock Measure Merge Mount 10, Gérard-de-Ternier 1213 Petit-Lancy Tél 00 41 22 388 87 28 CFPT-Informatique Conventions de codage CSharp
Remarque : ces verbes d’action proviennent de la commande Get-Verb du langage de script de Windows : PowerShell 2 Voir
CFPT-Informatique Conventions de codage CSharp Visual Studio 2010 / 2012 La Spécification du langage C# ne définit aucune norme de codage. Toutefois, les conventions de cette rubrique sont utilisées par Microsoft pour développer des exemples et de la documentation. Les conventions de codage répondent aux objectifs suivants : • Elles donnent au code un aspect homogène, afin que les lecteurs puissent se concentrer sur le contenu et non pas sur la disposition. • Elles permettent aux lecteurs de comprendre le code plus rapidement en faisant des hypothèses selon leur expérience précédente. • Elles facilitent la copie, la modification et la gestion du code. • Elles illustrent les meilleures pratiques de C#. var currentPerformanceCounterCategory = new System.Diagnostics. PerformanceCounterCategory(); • Vous ne devez pas modifier les noms des objets créés à l'aide de les outils du concepteur de Visual Studio pour les rendre conformes d'autres directives. Une bonne mise en page utilise la mise en forme pour souligner la structure du code et simplifier la lecture du code. Les exemples et échantillons de Microsoft sont conformes aux conventions suivantes : • Utilisez les paramètres par défaut de l'éditeur de code (mise en retrait intelligente, mise en retrait de quatre caractères, enregistrement des tabulations en tant qu'espaces). Pour plus d'informations, consultez Options, Éditeur de texte, C#, Mise en forme. • Écrivez une seule instruction par ligne. • Écrivez une seule déclaration par ligne. • Si les lignes continuation ne sont pas mises en retrait automatiquement, mettez-les en retrait d'un taquet de tabulation (quatre espaces). • Laissez au moins une ligne vide entre les définitions de méthode et de propriété. • Utilisez des parenthèses pour rendre des clauses apparentes dans une expression, comme illustré dans le code suivant. if ((val1 > val2) && (val1 > val3)) { // Take appropriate action. } Conventions Csharp Ecole d’Informatique 11 / 16 10, Gérard-de-Ternier 1213 Petit-Lancy Tél 00 41 22 388 87 28 • Commencez le texte du commentaire par une lettre majuscule. • Ajoutez un point à la fin du texte de commentaire. • Insérez un espace entre le délimiteur de commentaire (//) et le texte de commentaire, comme indiqué dans l'exemple suivant. // The following declaration creates a query. It does not run // the query. • Ne créez pas de blocs d'astérisques mis en forme autour des commentaires. Les sections suivantes décrivent les pratiques que l'équipe C# suit pour préparer des exemples de code et des échantillons. • Utilisez l'opérateur + pour concaténer des chaînes courtes, comme indiqué dans le code suivant. string displayName = nameList[n].LastName + ", " + nameList[n].FirstName; • Pour ajouter des chaînes dans des boucles, en particulier si vous travaillez avec de grandes quantités de texte, utilisez un objet StringBuilder. var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala"; var manyPhrases = new StringBuilder(); for (var i = 0; i < 10000; i++) { manyPhrases.Append(phrase); } //Console.WriteLine("tra" + manyPhrases); • Utilisez les types implicites pour les variables locales lorsque le type de la variable apparaît à droite de l'instruction, ou lorsque le type précis n'est pas important.
• N'utilisez pas var lorsque le type n'apparaît pas à droite de l'instruction.
• N'utilisez pas le nom de la variable pour indiquer le type de la variable. Il n'est peut-être pas correct.
• Évitez d'utiliser var à la place de dynamique. • Utilisez les types implicites pour déterminer le type des boucles de variable de boucle dans les boucles for et foreach. Conventions de codage CSharp CFPT-Informatique L'exemple suivant utilise les types implicites dans une instruction for.
L'exemple suivant utilise les types implicites dans une instruction foreach. foreach (var ch in laugh) { if (ch == 'h') Console.Write("H"); else Console.Write(ch); } Console.WriteLine(); • En général, utilisez int plutôt que des types non signés. L'utilisation de int est commune dans tout le langage C#, et il est plus facile d'interagir avec d'autres bibliothèques lorsque vous utilisez int. • Utilisez la syntaxe concise lorsque vous initialisez des tableaux sur la ligne de déclaration.
• Utilisez la syntaxe concise pour créer des instances d'un type délégué.
Conventions Csharp 13 / 16 • Utilisez une instruction try-catch pour la gestion de la plupart des exceptions.
• Simplifiez votre code à l'aide de l'instruction using du langage C#. Si vous avez une instruction tryfinally dans laquelle le seul code dans le bloc finally est un appel à la méthode Dispose, utilisez une instruction using à la place.
• Utilisez les types implicites dans la déclaration des variables de requête et de portée. var seattleCustomers = from cust in customers where == "Seattle" select ; • Alignez les clauses de requête sous la clause de , comme indiqué dans les exemples précédents. • Utilisez les clauses where avant les autres clauses de requête afin de vous assurer que les clauses de requête ultérieures s'appliquent correctement au groupe de données réduit et filtré. var seattleCustomers2 = from cust in customers where == "Seattle" orderby select cust; • Utilisez plusieurs clauses from au lieu d'une clause join pour accéder aux collections internes. Par exemple, chaque élément d'une collection d'objets Student peut contenir une collection de notes d'examens. Lorsque la requête suivante est exécutée, elle retourne chaque note qui est supérieure à 90, avec le nom de l'étudiant qui l'a reçue. // Use a compound from to access the inner sequence within each element. var scoreQuery = from student in students from score in student.Scores where score > 90 select new { Last = student.LastName, score }; © 2013 Microsoft. Tous droits réservés. |