Mi favorita es la serie "Patrones en C" de Adam Tornhill :
Además: siempre pienso en goto
la herramienta de un gran pobre para el patrón de decorador.
Actualización : Recomiendo encarecidamente usar Rust ( rust-lang.org ) en lugar de C, excepto cuando deba usar c. Rust tiene todos los beneficios de c, incluida la velocidad y la compatibilidad de la biblioteca binaria con c, pero el compilador maneja gran parte de la complejidad para garantizar que el código sea seguro para la memoria y no contenga carreras de datos. También es portátil, tiene una biblioteca estándar para tareas comunes y mucho más fácil de programar para varios patrones de diseño.
goto
tiene que ver con los decoradores?Los patrones de diseño podrían verse como características de lenguaje faltantes. La introducción de patrones de diseño: elementos de software orientado a objetos reutilizables afirma:
La oración en cursiva es la respuesta a su pregunta.
fuente
Polimorfismo a través de devoluciones de llamada, por ejemplo, la
qsort
función de la biblioteca estándar . Todo lo que necesita es una forma de comparar dos elementos y puede ordenar una matriz de ellos.Puede ser mucho más sofisticado que esto utilizando conjuntos de funciones (vtables) para representar las propiedades pertinentes de un tipo de modo que una rutina genérica pueda procesarlo de manera útil. Por ejemplo, las llamadas de lectura, escritura, etc. en un archivo abierto o en un puerto de red.
fuente
Sí hay. La inicialización diferida, singleton, grupo de objetos, estado del objeto, etc. se implementan fácilmente en C.
Ejemplo (inicialización diferida)
#include <stdio.h> struct foo { int payload; }; int calculate_payload() { printf("%s\n", "Performing lengthy initialization..."); return 42; } struct foo *get_default_foo() { static int foo_calculated = 0; static struct foo default_foo; if (!foo_calculated) /* assuming single-threaded access */ { foo_calculated = 1; default_foo.payload = calculate_payload(); } return &default_foo; } int main() { struct foo *foo1, *foo2; printf("%s\n", "Starting the program"); foo1 = get_default_foo(); printf("%d\n", foo1->payload); foo2 = get_default_foo(); printf("%d\n", foo2->payload); return 0; }
fuente
Desde lo alto de mi cabeza
fuente
Los patrones de diseño a menudo modelan cosas que están a solo un nivel de lo que ofrece un entorno existente. Si toma C con su biblioteca estándar como entorno, un patrón de diseño eminente es la Orientación a objetos.
fuente
El sistema de archivos virtual es un ejemplo perfecto para aprender el patrón de diseño.
fuente