#0 rule: penser objet, voire les modules (couple .c.h) comme des classes.
#1 rule: bien nommer et coder propre est plus important que bien commenter.
#2 rule: commenter = expliquer pourquoi, et pas quoi.
#3 rule: obey the three previous rules.

conventions:
------------
PAS de ligne de plus de 80 caractères, si besoin retourner à la ligne et
indenter correctement.

indentation = 2 esapces.

classe = nom du type défini par le module, CamelCase.

attributs = champs de la structure, lowerCamelCase.

méthodes = fonctions, lowerCamelCase préfixé par ClassName_
           arguments des méthodes en underscored_lowercase

enum si besoin en CamelCase

#define si besoin UNDERSCORED_UPPERCASE // exception pour alloc et alloc_vec.

prototype de la forme :
TypeRetourné ClassName_methodName (ClassName *cn, Arg1Type arg1_name,
                                   Arg2Type arg2_name);

définition des méthodes de la forme:
TypeRetourné
ClassName_methodName (ClassName *cn, Arg1Type arg1_name, Arg2Type, arg2_name)
{
  // code
}

pour les structure de contrôle, accolade si besoin seulement et sûr la même
ligne. si pas besoin d'accolade et instruction courte, okay de la mettre sur la
même ligne aussi (par exemple "if (!foo) return;" est ok).

-

Dans les .h: (interface)
------------
Interface de la classe = uniquement ce qui est public :
- PAS d'exposition de la structure (uniquement un typedef)
- PAS de fonction qui ne serviront que dans le module

Donc en gros, annonce (typedef) du nom de la classe et prototypes des méthodes
publiques + déclarations si besoin de constante type enum ou #define.

toujours avec ClassName_new comme constructeur et ClassName_delete comme
destructeur en tout premier parmis les prototypes.

tout les .h doivent être entouré d'un infndef, def ... endif

Dans les .c: (implementation)
------------
inclure scifi.h seulement il se charge de tout inclure,
définition de la struct,
définition des méthodes prototypées dans le .h
puis définitions précédées par le mot clef "static" (qui limite le scope au
fichier en cours) des méthodes privées.


-

si besoin fournir des accesseurs pour les attributs de la forme
ClassName_setAttrName (ClassName *cn, AttrType value);
et/ou (suivant les droit d'accès à l'attribut)
ClassName_getAttrName (ClassName *cn);

On accède pas à un attribut directement hors de la classe à laquelle il
appartient (c'est à dire hors du module ou sa struct est définie), on passe par
les accesseurs mis à disposition par la classe et déclarés dans son interface
(son fichier header).

Inclure scifi.h partout pour les macro alloc(ptr) et alloc_vec(ptr) qui
s'occupent de l'allocation et vérification (assert != NULL), et pour les headers
de la stdlib et autre lib qu'on va utiliser (sûrement la glibc pour ses
conteneurs).
