91 votes

Principes de conception, meilleures pratiques et modèles de conception pour C (ou programmation procédurale en général)?

Existe-t-il des principes de conception, des pratiques recommandées 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)

65voto

Jonathan Leffler Points 299946

Se cacher de l'Information - comme le préconise par Parnas (Logiciel Fondamentaux).

Attention à la gestion des en-têtes et de la visibilité:

  • Le tout dans un fichier source qui peut être caché du monde extérieur devraient être; seulement la documentation de l'interface externe doivent être exposés.
  • Tout ce qui est exposé est déclaré dans un en-tête.
  • Cet en-tête est utilisé lorsque la fonctionnalité est nécessaire (et où il est défini).
  • L'en-tête est autonome quand vous en avez besoin, vous l'utilisez, et vous n'avez pas à s'inquiéter à propos de 'ce que les autres en-têtes dois-je également inclure" parce que l'en-tête assure qu'il fonctionne en incluant tout ce qu'il faut pour le faire fonctionner.
  • L'en-tête est auto-protégé de sorte qu'il n'a pas d'importance si elle est incluse à plusieurs reprises.

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • Conception d'ensembles de fonctions pour travailler sur des "objets" (généralement des structures) - et de l'utilisation de ces fonctions plutôt que de fouiller les entrailles de la structure dans le code qui l'utilise. Il pense que l'auto-imposées de l'encapsulation.

23voto

Itay Maman Points 15470

Mes trois conseils:

  • Écrire des tests unitaires. Ils vont vous permettre de vous concentrer sur un design suites de votre problème comme vous allez le long. Beaucoup mieux que de compter (uniquement) sur la pré-médité de la pensée.
  • Avoir une mémoire d'un détecteur de fuites (il ya toutes sortes de bibliothèques) installé et en cours d'exécution dès le premier jour. Cette bibliothèque imprimer toutes les fuites dès que le programme/les tests de sorties. Cela vous permettra d'attraper une fuite dès que vous introduisez, ce qui rend sa fixation beaucoup moins douloureux.
  • Écrire OOP code en C. Pas si difficile. Alors qu'il est possible d'émuler la redéfinition de méthode, je vous suggère de commencer avec l'émulation de simples objets. Même ce simple mécanisme peut vous donner un excellent kilométrage.

Voici un exemple:

struct Vector {
  int size;
  int limit;
  int* ints; 
}

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;
}

22voto

e.James Points 51680

Il y a un bon, gratuit, livre en ligne, intitulé de la Programmation Orientée Objet Avec C ANSI, qui couvre le sujet de l'écriture de code orienté objet en C. Une recherche google pour "orienté objet C" donne aussi un certain nombre d'autres bons exemples et des ressources.

Si votre projet est essentiel à la sécurité, MISRA-C est un bon ensemble de règles. Il est destiné principalement pour l'embarqué c, mais elle peut être utile dans d'autres domaines.

Je me considère comme un OO codeur, et je fais beaucoup de travail avec embedded-C. Le meilleur conseil que je puisse donner, en particulier pour les grands projets, est de ne pas exagérer. La création d'une complète OO-cadre sur le dessus de la norme ANSI C peut être très tentant, mais il faut beaucoup de temps et d'efforts pour obtenir ce droit. L'amateur que vous obtenez, plus le temps que vous passerez le débogage de votre cadre au lieu de travailler sur le réel du projet. L'approche de la tâche avec une tête claire, et un bon, solide compréhension de YAGNI. Bonne chance!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X