Bueno, todavía se puede diseñar buenos tipos abstractos de datos en C. Se empieza por typedef
ing una estructura, proporcionando crear/destruir funciones, y luego otros setters/getters/hacedores de operar en esa estructura:
typedef struct {
/* maintain private state here */
unsigned int x;
char *y;
} mytype_t;
/** Creates a new mytype... */
mytype_t *mytype_create(unsigned int x, char *y);
/** Destroys a mytype, freeing all associated memory. */
void mytype_destroy(mytype_t *t);
/** Does something to mytype... */
void mytype_do_something(mytype_t *t, int bla);
Así que implemente estas funciones y mantenga su estado accediendo a los miembros 'privados' en la estructura, cuyo puntero se pasa a cada función.
A continuación, puede utilizar esta interfaz de la siguiente manera:
mytype_t* t = mytype_create(foo, bar);
mytype_do_something(t);
/* do some other stuff */
mytype_destroy(t);
El punto importante es la siguiente: tan pronto como se typedef struct, los usuarios del tipo no se les permite acceder a sus miembros. Solo deberían hablar con él a través de la interfaz pública/funciones definidas para él.
Veo las estructuras de destrucción de tipos de personas solo para evitar tener que escribir 'struct' por todas partes, pero hay que considerar que definen un nuevo tipo abstracto, cuya implementación interna puede cambiar. Seguro que un usuario del tipo puede bucear y acceder a los miembros, pero eso es algo malo de hacer. Una estructura typedef significa "privado, ¡fuera!". Esto es información básica escondida.
Tiendo a usar también un estilo de prefijo para nombrar, es decir, mytype_verb
. Esto ayuda con intellisense porque puedo escribir mytype_
y obtener una lista de funciones para ese tipo. También ayuda con los conflictos de nombres ya que no hay soporte de espacio de nombres en C, por lo que verá que la mayoría de las bibliotecas C usan prefijos (como sqlite3_
) frente a todo lo que definen.
Dupe of http://stackoverflow.com/questions/925754/resources-for-learning-c-program-design –
Eso es preguntar acerca de los recursos, no las técnicas como aquí. –