Programación genérica en C

Programación genérica en C

Encontrar puntos en común y crear abstracciones es una de las habilidades más valiosas para un programador. Como todavía está aprendiendo, le sugiero que haga lo siguiente:

(1) Implemente la pila para esa otra estructura. Sí, es doble trabajo, pero en tu etapa cada programa de trabajo cuenta. Acumula experiencia.

(2) Comparar los programas. ¿Cuáles son las partes que tienen en común? ¿Cuáles son las partes que difieren? Su objetivo es separar las partes que son comunes de las partes que son diferentes. ¿Cuáles son los medios que estos dos grupos utilizan para comunicarse? Las partes que tienen en común van a una parte de su sistema (stack.h/stack.c), las partes que son diferentes van a sus propios archivos (account.h/c, person.h/c, etc.) . Y la parte donde los combina debe incluir stack.h y la entidad parametrizadora.

(3) Intente encontrar todas las formas posibles que conoce que ofrece el lenguaje que puede usar para implementar la funcionalidad de estructura abstracta. Al principio, siempre parece que solo hay una forma, pero para cada problema no trivial siempre hay varios enfoques. En el caso de la pila, usando C estándar, por ejemplo, puede usar punteros vacíos, puede usar macros de preprocesador, debe buscar pegar tokens, puede usar punteros de función más punteros de estructura, etc.

(4) Implementar tantos de ellos como sea posible. Una vez más, esto es para la experiencia de aprendizaje. C tiene muchas trampas, y cuanto antes te encuentres con ellas, mejor.

(5) Después de haber enumerado e implementado todos estos enfoques diferentes, debe evaluarlos:¿Cuál fue el más fácil de usar? ¿Cuál fue más fácil de implementar? ¿Cuál es el más rápido? ¿Cuál es más fácil de depurar?


No hago mucho pirateo de C, pero creo que el camino a seguir con esto es void* .

Entonces, solo reescribe tu pila de push/pop void* en lugar de some_struct* . Se convierte en su problema mantener los tipos correctos, pero ese es solo el precio que paga por usar un lenguaje de programación de tan bajo nivel*.

*No quiere decir que esto sea algo malo.


Creo que la abstracción está principalmente en el ojo del programador. Un gran programador puede ver el patrón en declaraciones simples, incluso en un lenguaje de bajo nivel como C. Los lenguajes y su sintaxis seguramente pueden ayudar, pero cómo se escriben finalmente las declaraciones y expresiones es algo que diferencia a los buenos programadores de los malos. Dicho esto, ¿cómo te ayuda esto? Bueno, mi punto es familiarizarme con las construcciones en C para que las reconozcas cuando las veas, y el void* como menciona Kevin Montrose es común. Las estrategias que creo que son buenas es pensar sobre stdlib , ¿cómo se han solucionado las cosas allí? y refleje en un gran código cuando vea algo. Es decir, un patrón común en stdlib es tener cero (0) para representar OK. O reflexionar sobre qué tan bien funciona un descriptor de archivo con todos los read , write etc. funciona independientemente de su origen (socket, file, pipe, etc.). Esta pregunta SO (enlace) tiene algunos buenos enlaces a código excelente para leer.


(fuente:skitch.com)

Imagen de Thinking Forth , un gran libro antiguo de programación independientemente del idioma.