Projet

Général

Profil

SOP 001-Programmation » Historique » Version 10

Patrice Nadeau, 2015-08-27 20:36

1 1 Patrice Nadeau
h1. SOP 001-Programmation
2
3 2 Patrice Nadeau
TODO : issue:#9
4
5 1 Patrice Nadeau
Mes standards autant au niveau du style que de la documentation.
6
7
La plateforme (logiciel et matériel) est documenté dans le [[SOP_002-Environnement_informatique]].
8
9
{{lastupdated_at}} {{lastupdated_by}}
10
11
---
12
13
{{toc}}
14
15
h2. Diagrammes
16
17
Les représentations des différents processus d’un programme ou d’un circuit.
18
19
Les diagrammes DOIVENT être faits avec le logiciel Dia.
20
Ils PEUVENT être exportés en d’autre format.
21
22
h2. Système de gestion de version
23
24
Le logiciel "Git":http://www.git-scm.com/ DOIT être utilisé.
25
26
La version DOIT être en format: _majeur.mineur.revision_.
27
Les nombres majeur, mineur NE DOIVENT PAS contenir de zéro non significatif et DEVRAIT se limiter à deux chiffres.
28
29
Ex.
30
> Version 1.2.06
31
32
Les modifications DOIVENT se faire avec _git commit_, de la manière suivante :
33
* nom du fichier modifié,
34
* 1 espace,
35
* nom de l’item modifié entre parenthèses,
36
* un deux- points (<notextile>:</notextile>) sans espace avec l’item précédent,
37
* 1 espace,
38
* le texte du changement en anglais, commençant par une majuscule, au présent,
39
* un point (.)
40
41
Ex. :
42
> Modification ajouté manuellement
43
<pre><code class="bash">
44
git commit -m "usart.c (usart_Init): Add a new variable ctr."
45
</code></pre>
46
> Modification par un éditeur texte
47
<pre><code class="bash">
48
git commit
49
</code></pre>
50
51
Si les commit sont fait sans l’option *-m*, chaque fichier DOIT être séparé par une ligne vide.
52
53
h2. Code source
54
55
Les différents type de langage et de script décrit dans ce SOP.
56
57
h3. Généralités
58
59
h4. Langue
60
61
La langue (macros, variables, fonctions, commentaires, etc...) DOIT être l’anglais.
62
63
h4. Commentaires
64
65
Les commentaires DOIVENT être :
66
* sur la ligne précédent l’item à documenter
67
* en minuscules et commencer par une majuscule
68
69
70
h4. Nombre magique
71
72
L’utilisation de "nombre magique":http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants ne DOIT PAS être utilisé directement dans le code.
73
Il DOIVENT être définis dans une macro ou une variable globale.
74
75
h2. C
76
77
Le langage C, version C99 (ISO/IEC 9899:1999) utilisé avec le compilateur GCC.
78
79
h3. Commentaires
80
81
Les commentaires ne devant pas être inclus dans une documentation, DOIVENT être de style « C » :
82
83
<pre><code class="c">
84
/* Une seule ligne... */
85
86
...
87
88
/*
89
* Sur
90
* plusieurs
91
* lignes
92
*/
93
</code></pre>
94
95
h3. Doxygen
96
97
Chaque item DOIT être documentés de manière à générer une documentation avec le logiciel "Doxygen":http://www.stack.nl/~dimitri/doxygen/index.html.
98
99
Seulement les items définis dans les fichiers d’en-tête sont documentés par défaut.
100
Un commentaire Doxygen commence par *<notextile> /** </notextile>* , le compilateur le comprenant comme un commentaire ordinaire.
101
102
Les règles typographiques du [[SOP_000-Documentation]] s’appliquent :
103
* Gras (*@b*) : Items devant être inscrit tel quel.
104
* Italique & emphase (*@e*) : Items à remplacer par un choix ou nécessitant une attention particulière.
105 10 Patrice Nadeau
106 9 Patrice Nadeau
> Doxygen version &ge; 1.8.8 : Le bogue "737472":https://bugzilla.gnome.org/show_bug.cgi?id=737472 oblige de forcer le langage de la fonction dans l’exemple si on ne veut pas de numéro de ligne.
107 1 Patrice Nadeau
108
Les items DOIVENT être inscrit dans cet ordre :
109
<pre><code class="c">
110
/**
111 6 Patrice Nadeau
* @brief Short description
112
* @param[in,out] var Description. @n Possible values :
113
* − @b value1
114
* − @b value2
115
* @return
116
* @retval @b value Description
117
* @par Example :
118 1 Patrice Nadeau
* Example Title
119 7 Patrice Nadeau
* @code{.c}
120 1 Patrice Nadeau
* ...
121
* @endcode
122
* @pre Requirements
123
* @post Changes after the call to this function
124
* @see See also ...
125
* @note
126
* @warning
127
* @bug
128
* @todo
129
*/
130
</code></pre>
131
132
Des *@todo*, *@warning* et *@bug* supplémentaires PEUVENT être ajoutés dans le code.
133
L’item *@brief* DOIT toujours exister.
134
135
h3. Code
136
137
Le code est dans le style K&R, variante 1TBS
138
* Le « tab » DOIT être équivalent à 4 espaces.
139
* Le « backslah » DOIT être utilisé pour les lignes de plus de 80 caractères.
140
* Une instruction par ligne.
141
* Un espace avant et après un opérateur sauf pour les opérateurs « "unary":http://en.wikipedia.org/wiki/Unary_operation ».
142
143
One True Brace Style
144
<pre><code class="c">
145
int fonction (void)
146
{
147
    int x;
148
    /* the comment goes here, before the loop */
149
    if (var != 1) {
150
        x = x + 1;
151
        y++;
152
        printf("This is a long\
153
        line that should be splitted");
154
    } else {
155
        /** @warning this is a Doxygen warning */
156
        x--;
157
    }
158
    return(0);
159
}
160
</code></pre>
161
162
h4. Fichier entête
163
164
Avertissement
165
>Le gabarit template.h DOIT être utilisé.
166
167
Les fichier « header » DOIVENT contenir les déclarations des fonctions, macros et la partie « mainpage » de Doxygen.
168
169
Le nom du fichier DOIT être composé de la manière suivante :
170
* en minuscule
171
* 8 caractères maximum
172
* l’extension DOIT être *.h*
173
174
Une définition macro DOIT être faite pour éviter de ré-inclure le fichier.
175
La macro DOIT être dans le format *_fichier_h*
176
<pre><code class="c">
177
#ifndef _usart_h
178
#define _usart_h
179
...
180
#endif /*_usart.h*/
181
</code></pre>
182
183
h4. Fichier source
184
185
Le nom du fichier DOIT être composé de la manière suivante :
186
* en minuscule
187
* 8 caractères maximum
188
* l’extension DOIT être *.c*
189
190
h4. Librairies
191
192
Fichiers comprenant plusieurs déclarations et définitions reliés entre eux.
193
194
* Le nom DOIT respecter les standards ([[SOP_001-Programmation#Fichiers-Entêtes|1]] & [[SOP_001-Programmation#Fichiers-Sources|2]]) et être significatifs.
195
* Un fichier d’entête DOIT toujours exister.
196
* Les items sont précédés du nom de la librairie (minuscule) et séparés par un « underscore » (_).
197
198
L’utilisation de macros DOIT être utilisé au lieu de constates globales.
199
Il NE DEVRAIT PAS exister de de variables globales.
200
201
h4. Déclarations locales
202
203
Une déclaration n’ayant qu’une visibilité locale DOIT être précédé d’un « underscore » (_) et être de classe *static*.
204
205
<pre><code class="c">
206
/**
207
* @brief Local function
208
**/
209
static void _LocalFunc(void)
210
{
211
...
212
return;
213
}
214
</code></pre>
215
216
h4. Items désuets
217
218
Les déclarations ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (*-Wall*) si un appel est effectué.
219
220
L’attribut *<notextile> __attribute__((deprecated)) </notextile>* DOIT être ajouté à la déclaration.
221
La documentation DOIT indiquer les substituts à utiliser.
222
<pre><code class="c">
223
/**
224
* @brief OldFunction
225
* @detail will generate a warning if used
226
* @see @b NewFunction
227
*/
228
int OldFunction(void) __attribute__((deprecated));
229
</code></pre>
230
231
h4. Constantes
232
233
La déclaration DOIT inclure aussi la définition.
234
235
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
236
* En majuscule
237
* Séparé par un «underscore» (_) si contient plusieurs mots
238
* De classe _static_ ou _extern_ selon le besoin
239
240
<pre><code class="c">
241
/** 
242
 * @name List of constants
243
 * @{
244
 */
245
246
/**
247
* @brief Local const
248
*/
249
static int _PI = 3.15;
250
/**
251
* @brief The initialization string of the project
252
*/
253
static const char INIT_STR[6] = {'P', 'O', 'W', 'E', 'R'};
254
/**
255
* @brief Global const in the random library
256
*/
257
extern int random_MAX = 25;
258
259
/**
260
 * @}
261
 */
262
</code></pre>
263
264
h4. Typedef
265
266
Issue #18
267
268
h4. Variables
269
270
Format
271
* En minuscule.
272
* Séparé par un « underscore » (_) si contient plusieurs mots.
273
274
Définition de variables
275
<pre><code class="c">
276
/** @brief Local variable */
277
int _ctr;
278
/** @brief Global variable from the random librairy */
279
int random_ctr;
280
</code></pre>
281
282
h4. Structures
283
284
Format
285
* En minuscule, séparé par des «underscores» si nécessaire.
286
287
Définition de structures
288
<pre><code class="c">
289
/**
290
* @brief Structure for a local menu
291
* @see MenuSelect
292
*/
293
struct menu {
294
/** @brief Character used for the item */
295
char choice;
296
/** @brief Description of the item */
297
char *item;
298
};
299
</code></pre>
300
301
h4. Fonctions
302
303
Le nom est formé d’une lettre majuscule pour chacune des premières lettres des mots.
304
305
Le nom DOIT être dans un deux formats suivants :
306
* ActionItemAttribut, où _Action_ signifie :
307 5 Patrice Nadeau
** *Get* : Lis un registre
308
** *Read*, *Write* : Lis ou écris dans un fichier
309
** *Set* : Écris une valeur prédéfini dans un registre
310
** *Init* : Fonction d’initialisation
311 1 Patrice Nadeau
* isItemEtat
312 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
313 1 Patrice Nadeau
314
Exception
315
> Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver »). Dans ce cas, le nom définis dans le « datasheet » aura préséance. Ex. ReadRegister.
316
317
Une fonction DEVRAIT retourner une valeur. 
318
319
Dans le cas d'un « oui/non », la valeur DOIT être :
320
* Succès : *0* 
321
* Erreur : *1*
322
> L'utilisation d'un type booléen (*true* & *false*) est permise avec *<stbool.h>* (C99).
323
324
Dans le cas d'une fonction retournant un pointeur :
325
* Erreur : *NULL* 
326
* autre valeur  : adresse du pointeur
327
328
329
Définition de fonctions
330
<pre><code class="c">
331
/**
332
* @brief Check if a timer is set
333
* @param[in] nb Timer number. @n Possible values :
334
* − @b TIMER_1
335
* − @b TIMER_2
336
* @return
337
* @retval true Timer @e nb is set
338
* @retval false Timer @e nb is NOT set
339
* @par Example :
340
* Check if the timer is set
341
* @code{.c}
342
* ...
343
* result = isTimerSet();
344
* ...
345
* @endcode
346
* @pre TimerInit
347
**/
348
static bool isTimerSet(uint8_t nb);
349
/**
350
* @brief Set the led to green
351
**/
352
SetLedColor(GREEN);
353
/**
354
* @brief Set register of the chip XYZ
355
*
356
* The name does not follow the standards but does match the datatsheet
357
* This is a local function not meant to be called outside this librairy
358
**/
359
static void _WriteReg(void);
360
</code></pre>
361
362
h3. Macros
363
364
Les directives du préprocesseur C.
365
366
* Utilisé dans le code source et les fichiers entête.
367
* DOIT toujours commencer à la colonne 0.
368
369
h4. include
370
371
Pour inclure d’autres fichier comme les fichiers entête.
372
>N’est pas documenté dans Doxygen.
373
374
h4. ifdef / ifndef
375
376
Surtout utiliser pour des options de compilation sur différentes plateforme.
377
>N’est pas documenté dans Doxygen.
378
379
<pre><code class="c">
380
#ifndef usart_AVR
381
#error "usart.h is not supported on this AVR !"
382
#endif
383
</code></pre>
384
385
h4. error
386
387
Affiche une erreur et arrête la compilation
388
>N’est pas documenté dans Doxygen.
389
390
<pre><code class="c">
391
#ifndef __test__
392
#error "Error !"
393
#endif
394
</code></pre>
395
396
h4. #warning
397
398
Affiche une erreur mais n’arrête la compilation
399
>N’est pas documenté dans Doxygen.
400
401
<pre><code class="c">
402
#ifndef __test__
403
#warning "Warning !"
404
#endif
405
</code></pre>
406
407
h4. define 
408
409
Définis une valeur au moment de la compilation.
410
* Format
411
** En majuscule.
412
** Séparé par un «underscore» si contient plusieurs mots.
413
* Doxygen
414
** @brief
415
** @name pour les listes de macros (regroupement dans la documentation)
416
417
Définition de macros
418
<pre><code class="c">
419
/**
420
* @name Mathematical macros listed together
421
* @{
422
*/
423
/** @brief Value for PI */
424
#define _PI 3.14
425
/** @brief Another number */
426
#define _MAGIC_NUMBER 42
427
/**
428
* @}
429
*/
430
/** @brief Even parity */
431
#define usart_PARITY_EVEN 'e'
432
</code></pre>
433
434
h3. Atmel AVR
435
436
Particularités pour les micro-contrôleurs AVR d’Atmel.
437
438
* Progmem : Pour mettre une fonction en Flash au lieu de SRAM.
439
** Le nom de la fonction est suivie de *_P*.
440
* main : Ne revient jamais à un niveau supérieur.
441
** Définir la fonction main avec l’attribut *noreturn*.
442 3 Patrice Nadeau
** La boucle sans fin la plus optimisé est le *for (;;)*.
443 1 Patrice Nadeau
* Atomic : Opérations ne devant pas être interrompus.
444
445
Particularités pour AVR
446
<pre><code class="c">
447
/**
448
* @brief Progmem function
449
* @return An unsigned 8 bits integer
450
*/
451
uint_8t PrintString_P()
452 4 Patrice Nadeau
453 1 Patrice Nadeau
/* main function */
454
void main(void) __atribute__((noreturn))
455
{
456
    ...
457
    /* never return */
458
    for (;;) {
459
    }
460
}
461
462
/* atomic operations */
463
#ifndef S_SPLINT_S
464
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
465
/* 
466
* operations that must not be interupted
467
* like loading a 16 bit register with a 8 bit register 
468
*/
469
}
470
#endif
471
</code></pre>
472
473
h3. Distribution
474
475
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
476
* ChangeLog
477
* README
478
* Files.lst
479
* Makefile
480
* Makefile.mk
481
* LICENSE.txt
482
* *.c
483
* *.h
484
* projet.pdf (généré par Doxygen)
485
486
Avec mon makefile :
487
<pre><code class="bash">
488
make dist
489
</code></pre>
490
491
h3. Modifications
492
493
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
494
495
Chaque changement est fait avec :
496
<pre><code class="bash">
497
git add nom_fichier
498
git commit
499
</code></pre>
500
501
La ligne DOIT 
502
* être au temps présent
503
* être en anglais
504
* se termine par un point
505
* être dans le format suivant :
506
> La partie _section_ est facultative
507
508
<pre><code class="text">
509
fichier1 (fonction) <section>: 
510
Ajoute une description au temps présent.
511
Décrire les bogues réglés si il y en avaient.
512
</code></pre>
513
514
h3. Changelog
515
516
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
517
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
518
519
Ce fichier doit s'appeler *ChangeLog* et DOIT être généré à partir de _Git_ (les doubles espaces ne sont pas une erreur de frappe :
520
<pre><code class="bash">
521
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
522
</code></pre>
523
524
h3. Validation du code
525
526
Le logiciel _splint_ est utilisé.
527
* Un « typecast » DOIT être utilisé lorsque détecté.
528
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
529
530
h2. Makefile
531
532
h2. Nagios
533
534
h3. Plugins
535
536
https://nagios-plugins.org/doc/guidelines.html
537
538
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
539
> *SERVICE STATUS:* texte
540
541
Les codes de retour sont les suivants:
542
|_. Valeur |_. Service Status |_. Description |
543
| 0 | OK | Le service fonctionne |
544
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
545
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
546
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
547
548
Les arguments suivants DOIVENT être fournis
549
* *-H* (*--hostname*) :
550
* *-w* (*--warning*) :
551
* *-c* (*--critical*) :
552
* *-V* (*--version*) :
553
* *-h* (*--help*) :
554
555
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
556
557
En _C_, les fonctions suivantes DOIT être utilisées :
558
* _print_revision_ (utils.c)
559
* _print_help_
560
* _getopt_long_ (getopt.h)
561
562
h2. Puppet
563
564
h3. Généralités
565
566
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
567
* Tabulation : 2 espaces
568
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
569
* Commentaires : Style #
570
* Guillemets
571
** Simple : Pour une « string » sans variables.
572
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
573
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
574
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
575
* Alignement de => : DOIT être aligné dans un même paragraphe.
576
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
577
* Lien symbolique : DOIT être déclaré avec *ensure => link*
578
579
Ex. :
580
<pre><code class="ruby">
581
file { '/var/log/syslog':
582
ensure => link,
583
target => '/var/log/messages',
584
}
585
</code></pre>
586
587
* File mode : 
588
** 4 chiffres
589
** simple guillemet
590
* Variables
591
** lettres
592
** chiffres
593
** « underscore »
594
595
h3. Documentation
596
597
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
598
599
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
600
* Bloc de commentaires qui commence sur la première ligne du fichier
601
* Titre avec le symbole *<notextile>=</notextile>*
602
* Séparation avec le symbole *<notextile>-</notextile>*
603
* Emphase (mot entouré du symbole)
604
** * : gras
605
** _ : souligné
606
** + : Police de caractères pour le code
607
* Sections
608
** = Class:
609
** == Parameters:
610
** == Requires:
611
** == Sample Usage:
612
* Classe
613
** Une classe par fichier « manifest »
614
615
h2. Script
616
617
h3. Bash
618
619
<pre><code class="bash">
620
#/bin/bash
621
622
function print_revision {
623
}
624
625
function print_help {
626
    print_revision
627
}
628
</code></pre>
629
630
h3. Perl
631
632
<pre><code class="perl">
633
634
</code></pre>
635
636
h3. PowerShell
637
638
Version 4.0. Supporte :
639
* Windows 8.1 (natif)
640
* Windows Server 2012 R2 (natif)
641
* Windows 7 SP1
642
* Windows Server 2008 R2 SP1
643
* Windows Server 2012
644
645
h4. Fichier
646
647
Le fichier DOIT être composé de la manière suivante :
648
* L’extension est .ps1
649
* Une longue ligne peux être séparée avec un « back tick » (‘).
650
651
h4. Commentaires
652
653
L’aide est accéder par _Get-Help_
654
<pre>
655
#REQUIRES -Version 2.0
656
<#
657
.SYNOPSIS
658
A brief description of the function or script.
659
This keyword can be used only once in each topic.
660
.DESCRIPTION
661
A detailed description of the function or script.
662
This keyword can be used only once in each topic.
663
.NOTES
664
File Name
665
: xxxx.ps1
666
Author
667
:
668
Prerequisite
669
: PowerShell V2 over Vista and upper.
670
Copyright 2011 -
671
.LINK
672
Script posted over:
673
http://
674
.EXAMPLE
675
Example 1
676
.EXAMPLE
677
Example 2
678
#>
679
</pre>
680
681
h2. Vim
682
683
* Entête (en commentaires)
684
** Titre
685
** Last Change:
686
** Maintainer:
687
** License: This file is placed in the public domain.
688
* Autre mots reconnus
689
** BUG: (Error:)
690
** TODO:
691
** Note:
692
** FIXME
693
694
h2. Références
695
696
Références ayant servis à ce document.
697
698
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
699
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html