Projet

Général

Profil

SOP 001-Programmation » Historique » Version 3

Patrice Nadeau, 2015-04-19 10:06

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