Projet

Général

Profil

SOP 001-Programmation » Historique » Version 1

Patrice Nadeau, 2015-04-19 09:23

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