Existe-t-il des principes de conception, des meilleures pratiques et des modèles de conception connus que l'on peut suivre lors de la conception d'un projet C? Ou des principes de conception utiles pour la programmation procédurale (impérative) en général?
(Je suis enfant de la 'génération orientée objet' et dois concevoir un grand projet C pour la première fois)
Masquage des informations - comme le préconise Parnas ( Software Fundamentals ).
Gestion soigneuse des en-têtes et visibilité:
L'en-tête est auto-protégé - il n'a donc pas d'importance s'il est inclus plusieurs fois.
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...rest of header contents, including other #include lines if necessary
#endif /* HEADER_H_INCLUDED */
Concevez des ensembles de fonctions pour travailler sur des "objets" (généralement des structures) - et utilisez ces fonctions plutôt que de fouiner les entrailles de la structure dans le code qui l'utilise. Considérez-le comme une encapsulation auto-imposée.
Il existe un bon livre en ligne gratuit, intitulé Programmation orientée objet avec ANSI-C , qui couvre le sujet de écrire du code orienté objet en C. A recherche Google pour "C orienté objet" donne également un certain nombre d'autres bons exemples et ressources.
Si votre projet est critique pour la sécurité, MISRA-C est un bon ensemble de règles. Il est principalement destiné au c intégré, mais il peut également être utile dans d'autres domaines.
Je me considère comme un codeur OO, et je travaille beaucoup avec Embedded-C. Le meilleur conseil que je puisse donner, en particulier pour les grands projets, est de ne pas en faire trop. Créer un = complet OO framework au-dessus d'ANSI C peut être très tentant, mais cela prend beaucoup de temps et d'efforts pour bien faire les choses. Plus vous êtes amateur, plus vous passez de temps à déboguer votre framework à la place de travailler sur le projet réel . Approchez la tâche avec la tête claire et une bonne compréhension solide de YAGNI . Bonne chance!
Mes trois conseils:
Voici un exemple:
typedef struct Vector {
int size;
int limit;
int* ints;
} Vector;
Vector* Vector_new() {
Vector* res = (Vector*) malloc(sizeof(Vector));
res->limit = 10;
res->size = 0;
res->ints = (int*) malloc(sizeof(int) * res.limit);
return res;
}
void Vector_destroy(Vector* v) {
free(v->ints);
free(v);
}
void Vector_add(Vector* v, int n) {
if(v->size == v->limit) {
v->limit = v->limit * 2 + 10;
v->ints = realloc(v->ints, v->limit);
}
v->ints[v->size] = n;
++v->size;
}
int Vector_get(Vector* v, int index) {
if(index >= 0 && index < v->size)
return v->ints[index];
assert false;
}
La POO est une méthodologie et non une technologie. Donc, mon premier conseil est d'arrêter de le considérer comme une programmation procédurale.
Pour faire valoir e.James, vous ne voulez pas essayer de recréer un langage orienté objet ou prétendre que vous en avez les capacités. Vous pouvez toujours faire toutes les bonnes choses en vous accrochant à quelques principes simples:
La norme de codage SEI CERT C fournit n bon ensemble de règles et de bonnes pratiques courantes ainsi que des choses que vous devriez essayer d'éviter d'utiliser.