Projet

Général

Profil

SOP 001-Programmation » Historique » Version 6

Patrice Nadeau, 2015-08-25 20:40

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 6 Patrice Nadeau
* @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 1 Patrice Nadeau
* 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 5 Patrice Nadeau
** *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 1 Patrice Nadeau
* isItemEtat
310 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
311 1 Patrice Nadeau
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 4 Patrice Nadeau
452 1 Patrice Nadeau
/* main function */
453
void main(void) __atribute__((noreturn))
454
{
455
    ...
456
    /* never return */
457
    for (;;) {
458
    }
459
}
460
461
/* atomic operations */
462
#ifndef S_SPLINT_S
463
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
464
/* 
465
* operations that must not be interupted
466
* like loading a 16 bit register with a 8 bit register 
467
*/
468
}
469
#endif
470
</code></pre>
471
472
h3. Distribution
473
474
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
475
* ChangeLog
476
* README
477
* Files.lst
478
* Makefile
479
* Makefile.mk
480
* LICENSE.txt
481
* *.c
482
* *.h
483
* projet.pdf (généré par Doxygen)
484
485
Avec mon makefile :
486
<pre><code class="bash">
487
make dist
488
</code></pre>
489
490
h3. Modifications
491
492
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
493
494
Chaque changement est fait avec :
495
<pre><code class="bash">
496
git add nom_fichier
497
git commit
498
</code></pre>
499
500
La ligne DOIT 
501
* être au temps présent
502
* être en anglais
503
* se termine par un point
504
* être dans le format suivant :
505
> La partie _section_ est facultative
506
507
<pre><code class="text">
508
fichier1 (fonction) <section>: 
509
Ajoute une description au temps présent.
510
Décrire les bogues réglés si il y en avaient.
511
</code></pre>
512
513
h3. Changelog
514
515
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
516
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
517
518
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 :
519
<pre><code class="bash">
520
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
521
</code></pre>
522
523
h3. Validation du code
524
525
Le logiciel _splint_ est utilisé.
526
* Un « typecast » DOIT être utilisé lorsque détecté.
527
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
528
529
h2. Makefile
530
531
h2. Nagios
532
533
h3. Plugins
534
535
https://nagios-plugins.org/doc/guidelines.html
536
537
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
538
> *SERVICE STATUS:* texte
539
540
Les codes de retour sont les suivants:
541
|_. Valeur |_. Service Status |_. Description |
542
| 0 | OK | Le service fonctionne |
543
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
544
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
545
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
546
547
Les arguments suivants DOIVENT être fournis
548
* *-H* (*--hostname*) :
549
* *-w* (*--warning*) :
550
* *-c* (*--critical*) :
551
* *-V* (*--version*) :
552
* *-h* (*--help*) :
553
554
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
555
556
En _C_, les fonctions suivantes DOIT être utilisées :
557
* _print_revision_ (utils.c)
558
* _print_help_
559
* _getopt_long_ (getopt.h)
560
561
h2. Puppet
562
563
h3. Généralités
564
565
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
566
* Tabulation : 2 espaces
567
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
568
* Commentaires : Style #
569
* Guillemets
570
** Simple : Pour une « string » sans variables.
571
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
572
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
573
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
574
* Alignement de => : DOIT être aligné dans un même paragraphe.
575
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
576
* Lien symbolique : DOIT être déclaré avec *ensure => link*
577
578
Ex. :
579
<pre><code class="ruby">
580
file { '/var/log/syslog':
581
ensure => link,
582
target => '/var/log/messages',
583
}
584
</code></pre>
585
586
* File mode : 
587
** 4 chiffres
588
** simple guillemet
589
* Variables
590
** lettres
591
** chiffres
592
** « underscore »
593
594
h3. Documentation
595
596
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
597
598
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
599
* Bloc de commentaires qui commence sur la première ligne du fichier
600
* Titre avec le symbole *<notextile>=</notextile>*
601
* Séparation avec le symbole *<notextile>-</notextile>*
602
* Emphase (mot entouré du symbole)
603
** * : gras
604
** _ : souligné
605
** + : Police de caractères pour le code
606
* Sections
607
** = Class:
608
** == Parameters:
609
** == Requires:
610
** == Sample Usage:
611
* Classe
612
** Une classe par fichier « manifest »
613
614
h2. Script
615
616
h3. Bash
617
618
<pre><code class="bash">
619
#/bin/bash
620
621
function print_revision {
622
}
623
624
function print_help {
625
    print_revision
626
}
627
</code></pre>
628
629
h3. Perl
630
631
<pre><code class="perl">
632
633
</code></pre>
634
635
h3. PowerShell
636
637
Version 4.0. Supporte :
638
* Windows 8.1 (natif)
639
* Windows Server 2012 R2 (natif)
640
* Windows 7 SP1
641
* Windows Server 2008 R2 SP1
642
* Windows Server 2012
643
644
h4. Fichier
645
646
Le fichier DOIT être composé de la manière suivante :
647
* L’extension est .ps1
648
* Une longue ligne peux être séparée avec un « back tick » (‘).
649
650
h4. Commentaires
651
652
L’aide est accéder par _Get-Help_
653
<pre>
654
#REQUIRES -Version 2.0
655
<#
656
.SYNOPSIS
657
A brief description of the function or script.
658
This keyword can be used only once in each topic.
659
.DESCRIPTION
660
A detailed description of the function or script.
661
This keyword can be used only once in each topic.
662
.NOTES
663
File Name
664
: xxxx.ps1
665
Author
666
:
667
Prerequisite
668
: PowerShell V2 over Vista and upper.
669
Copyright 2011 -
670
.LINK
671
Script posted over:
672
http://
673
.EXAMPLE
674
Example 1
675
.EXAMPLE
676
Example 2
677
#>
678
</pre>
679
680
h2. Vim
681
682
* Entête (en commentaires)
683
** Titre
684
** Last Change:
685
** Maintainer:
686
** License: This file is placed in the public domain.
687
* Autre mots reconnus
688
** BUG: (Error:)
689
** TODO:
690
** Note:
691
** FIXME
692
693
h2. Références
694
695
Références ayant servis à ce document.
696
697
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
698
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html