Je travaille / codage dans C # / Java depuis quelques années, de sorte que les bases, etc. Ne me donnez pas beaucoup de difficultés. Mais je n'ai jamais rien fait plus grand que les petits programmes d'apprentissage de la ligne de commande en c. P>
Maintenant, j'essaie de créer un émulateur de téléphone portable pour Linux et je n'ai aucune idée de la structure de mon code lorsque son objet n'est pas orienté objet. J'ai 3 gros livres qui couvrent C en détail mais aucun d'entre eux ne couvre comment coder pour la maintenabilité dans un projet plus grand. P>
J'espérais donc que certaines d'entre vous, des personnes plus expérimentées pourraient me signaler à une meilleure pratique ou similaire? p>
7 Réponses :
Certaines pensées (et cette question devrait être un wiki communautaire) p>
Vous devriez clarifier - par "UNIX Dossier de la poignée d'API" que vous voulez dire ouvert (2) code> et amis ou fopen (3) code> et amis?
Je voulais dire les appels ouverture (2) code> - fopen (3) code> fait réellement partie de la norme C. Aux fins de l'argument, il n'est pas pertinent, cependant, comme les deux utilisent des informations similaires cachées. Si une poignée de fichier est un pointeur ou un entier est un détail de mise en œuvre.
Addenda: Dans la plupart des cas, vous voudrez un pointeur pour éviter de garder l'état mondial.
structure en général la même chose. Séparez les choses en plusieurs fichiers, chacun contenant du code qui effectue des travaux connexes. P>
Souvent avec C, vous pouvez toujours penser à des objets. Mais au lieu de classes avec des méthodes, ce sont des structures et des fonctions qui fonctionnent sur une structure. P>
Vous pouvez faire OO en C voir par exemple: p>
Juste parce que c'est C ne signifie pas que ce n'est pas orienté objet. Voir Cette question ou un nombre de questions nommé avec une variation de "l'apprentissage C venant de fond orienté objet". P>
Les techniques telles que ceci sont encore utilisées aujourd'hui - GIMP est construite sur GTK + , qui comprend le Bibliothèque GOBJECT pour codage orienté objet dans C. Ce n'est peut-être pas le meilleur moyen et peut ne pas être "idiomatique" c, mais cela peut vous aider. P>
L'autre conseil que j'ai sur la manière de contrôler la maintenabilité dans un grand projet est Utiliser des bibliothèques. EM> C n'a pas beaucoup d'intégré, donc plus la fonctionnalité que vous puissiez sortir d'un portable ( Open Source?) Library tiers, moins le code vous em> dois écrire (et donc maintenir). p>
gtk + a une nouvelle fois Glib , qui est une bibliothèque de captures avec beaucoup de Caractéristiques que les personnes se sont retrouvées à la mise en œuvre et à la réinvestissement dans C. Apache possèdent son propre, le Apache Portable Runtime , qui fait quelque chose de très similaire (mais avec différents types de fonctions). Il existe également quelques bibliothèques de chaîne, ce qui vous sauvera probablement beaucoup de maux de tête et de nombreuses bibliothèques à usage spécial (readline pour des invites interactives, ncurses pour les interfaces textuelles telles que VI, etc.) qui sont utiles mais peuvent ne pas jouer un rôle énorme dans votre application particulière. P>
Les meilleurs choix dépendent de leur diplôme sur ce que vous écrivez. Si vous écrivez un noyau de système d'exploitation ou un pilote de périphérique ou une application de systèmes intégrés, ignorez tous les conseils ci-dessus. Si vous souhaitez implémenter un langage de programmation, consultez flex code> et Pour commencer avec Grammars sur quelques projets de test plus petits, mais je vous recommande de rouler votre propre analyseur et Lexer pour un projet sérieux (si, sans autre raison que l'amélioration des rapports d'erreur). P> bison < / Code>
Je recommanderais de scinder votre projet dans les composants plus petits em> et placez chaque composant dans son propre fichier .c et .h. Vous placez le code dans le fichier .C et les structures et prototypes dans le fichier .h. p>
Faire cela, vous pouvez programmer l'objet orienté objet en C si vous gardez vos fonctions réentrantes: dites quelques fonctions effectuent une fonction foo, puis plutôt que d'avoir des variables globales dans Si une fonction En outre, recherchez Google Codesearch pour les projets C pour voir comment cela se fait. P> foo code> dans Fred () code> est uniquement utilisée quelque part dans statique code> et ne mettez pas le prototype
OO est juste du sucre syntaxique. Les compilateurs C ++ originaux compilés à C. Voici un exemple de base d'environ la même classe de Java et en C:
Point.java
import java.lang.Math;
public class Point
{
private int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public int getDistance(Point p)
{
return Math.sqrt((p.x - this.x) * (p.x - this.x) + (p.y - this.y) * (p.y - this.y));
}
}
Point.h
typedef struct __Point Point;
typedef struct __Point
{
int x, y;
int (*getDistance)(Point*,Point*);
} Point;
Point* new_Point(int, int);
void delete_Point(Point*);
int getDistance(Point*, Point*);
Point.c
#include <math.h>
#include "Point.h"
Point* new_Point(int x, int y)
{
Point* this = malloc(sizeof(Point));
this->x = x;
this->y = y;
this->getDistance = getDistance;
}
void delete_Point(Point* this)
{
free(this);
}
int getDistance(Point* this, Point* p)
{
return sqrt((p->x - this->x) * (p->x - this->x) + (p->y - this->y) * (p->y - this->y));
}
Quelques suggestions ... P>
• Utilisez le modificateur code> statique code> autant que possible; C'est (principalement) l'équivalent de • Essayez de ne pas utiliser trop de variables globales, en particulier si votre programme utilise plusieurs threads. P>
• Informations relatives au groupe ensemble dans • C n'a pas de manipulation d'exception, vérifiez donc les valeurs de retour de toutes les fonctions système que vous appelez. P> privé code> dans les langues OO. P>
Structs code>; Ce sont vos objets en c. P>
Je serais tenté d'utiliser C ++, mais vous pouvez toujours écrire du code OO en C - sans aucune construction de langue.
Le code doit être en C, mais sinon je serais sûrement d'accord;).
Pourquoi le code "doit-il" être en C? Est-ce que quelqu'un tiennent une arme à feu à votre tête disant "Si je vois un seul
std :: COUT CODE> Je vais ..."