Comment dois-je structurer des projets complexes en C?
J'ai un peu plus que débutant-niveau C des compétences et voudrais savoir si il y a tout de facto les "normes" de la structure un peu complexe de l'application dans C. Même interface graphique basé.
J'ai été en utilisant toujours le paradigme OO en Java et PHP, et maintenant que je veux apprendre le C, j'ai peur que je structure mes applications dans le mauvais sens. Je suis à une perte sur les lignes directrices à suivre pour avoir la modularité, le découplage et la sécheresse avec un langage procédural.
Avez-vous des lectures à proposer? Je ne pouvais pas trouver n'importe quel cadre d'application pour le C, même si je n'utilise pas de cadres, j'ai toujours trouvé de belles idées en parcourant leur code.
- La philosophie Unix est assez utile pour l'organisation de grands projets: http://www.faqs.org/docs/artu/ch01s06.html
Vous devez vous connecter pour publier un commentaire.
La clé est la modularité. C'est plus facile à concevoir, mettre en œuvre, de compiler et maintenir.
Si vous avez le temps pour l'apprentissage, jetez un oeil à la façon dont un Ada application est structurée, avec ses obligatoire
package
(module d'interface) etpackage body
(module de mise en œuvre).C'est pour le codage.
Pour le maintien (et n'oubliez pas que vous code une seule fois, mais vous maintenir à plusieurs reprises), je suggère de documenter votre code; Doxygen est un bon choix pour moi. Je suggère également de construire une forte régression de la suite de tests, ce qui vous permet de refactoriser.
C'est une idée fausse commune que OO techniques ne peuvent pas être appliquées en C. Plus le peut, c'est juste qu'ils sont un peu plus lourdes que dans les langues avec la syntaxe dédiés à l'emploi.
L'un des fondements de la robustesse de la conception du système est l'encapsulation d'une mise en œuvre derrière une interface.
FILE*
et les fonctions qui fonctionnent avec elle (fopen()
,fread()
etc.) est un bon exemple de la façon dont l'encapsulation peut être appliquée en C pour mettre en place les interfaces. (Bien sûr, puisque C manque de spécificateurs d'accès vous ne pouvez pas appliquer que personne ne lit à l'intérieur d'unstruct FILE
, mais seulement un masochiste allait le faire.)Si nécessaire, polymorphe, le comportement peut être dû en C à l'aide de tableaux de pointeurs de fonction. Oui, la syntaxe est laid, mais l'effet est le même que les fonctions virtuelles:
weight
propriété dans leCat
struct. Dans lecat_eat
méthode, comment pouvez-vous augmenter le poids du Chat en cours ? (comme unthis
mot-clé)this
, par exempleint (*eat)(struct IAnimal *_this, int food);
. Puis dans une classe dérivée de la mise en œuvre de cette méthode, vous serait immédiatement abattu le pointeur à la base d'un pointeur-à-dérivé pour accéder à des dérivés de la classe des champs.Toutes les bonnes réponses.
Je tiens seulement à ajouter "minimiser la structure de données". Ce pourrait même être plus facile en C, car si C est "C with classes", la programmation orientée objet est en train de vous encourager à prendre toutes les nom /verbe en tête et de le transformer en une classe /méthode. Qui peut être très rentable.
Par exemple, supposons que vous disposez d'un tableau de relevés de température à points dans le temps, et que vous souhaitez les afficher sous la forme de courbes dans Windows. Windows a un message de PEINTURE, et quand vous le recevez, vous pouvez parcourir le tableau en faisant LineTo fonctions, mise à l'échelle les données que vous allez convertir les coordonnées des pixels.
Ce que j'ai vu, beaucoup trop de fois, est, depuis le graphique est composé de points et de lignes, les gens vont construire une structure de données composée d'objets et les objets de ligne, chacun est capable de DrawMyself, et ensuite faire persistante, sur la théorie que c'est en quelque sorte "plus efficace", ou qu'il pourrait, peut-être, être en mesure de la souris sur les pièces de la carte et d'afficher les données numériquement, afin qu'ils construisent des méthodes sur les objets à traiter avec cela, et que, bien sûr, implique la création et la suppression d'encore plus d'objets.
Si vous vous retrouvez avec une énorme quantité de code qui est oh-so-lisible et simple passe 90% de son temps à la gestion des objets.
Tout cela se fait au nom de la "bonne pratique" et "efficacité".
Au moins en C simple, efficace sera de plus en plus évidents, et la tentation de construire des pyramides de moins en moins forte.
La GNU normes de codage ont évolué au cours des deux dernières décennies. Ce serait une bonne idée de les lire, même si vous ne suivez pas à la lettre. La réflexion sur les points soulevés dans eux vous donne une peau plus ferme sur la base de la structure de votre propre code.
J'avais le sens commun veut que vous regardez le code de populaire open source C du projet, à l'instar de... hmm... le noyau Linux, ou Git; et de voir comment ils l'organiser.
Le numéro de la règle pour l'application complexe: il doit être facile à lire.
De faire application complexe de plus simple, j'utilise Diviser pour régner.
Si vous savez comment structurer votre code en Java ou en C++, alors vous pouvez suivre les mêmes principes avec du code C. La seule différence est que vous n'avez pas le compilateur à vos côtés et vous avez besoin de faire tout très attentivement manuellement.
Car il n'y a pas de packages et de classes, vous devez commencer par concevoir soigneusement vos modules. L'approche la plus commune est de créer un dossier source pour chaque module. Vous devez vous appuyer sur des conventions de nommage pour les différencier de code entre les différents modules. Par exemple préfixe de toutes les fonctions avec le nom du module.
Vous ne pouvez pas avoir des classes avec le C, mais vous pouvez facilement mettre en œuvre "les Types de Données Abstraites". Vous créez une .C et .H fichier pour chaque type abstrait de données. Si vous préférez, vous pouvez avoir deux fichiers d'en-tête, l'une publique et l'autre privée. L'idée est que toutes les structures, les constantes et les fonctions qui doivent être exportés aller pour le public d'en-tête de fichier.
Vos outils sont également très importants. Un outil utile pour C est les peluches, qui peut vous aider à trouver les mauvaises odeurs dans votre code. Un autre outil que vous pouvez utiliser est Doxygen, qui peut vous aider à générer la documentation.
Encapsulation est toujours la clé du succès d'un développement, quel que soit le langage de développement.
Un truc que j'ai utilisé pour aider à encapsuler "privé" méthodes en C est de ne pas inclure leurs prototypes dans l' ".h" fichier.
Je suggère la lecture d'un C/C++ manuel comme une première étape. Par exemple, C Primer Plus est une bonne référence. En regardant à travers les exemples vous donnent une idée sur comment faire un plan de votre java OO à un plus langue de la procédure comme le C.