¿Hay "patrones de diseño" en C? [cerrado]

81

Sé que los patrones de diseño son generalmente algo que está conectado a la programación OO, pero ¿tienes algún patrón que usas a menudo cuando programas C?

No me interesan las traducciones simples de los patrones clásicos de OO y, por favor, no menciones el dispositivo de Duff. ;-)

onemasse
fuente

Respuestas:

83

Mi favorita es la serie "Patrones en C" de Adam Tornhill :

Además: siempre pienso en gotola 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.

coolaj86
fuente
9
¿Podría explicarnos qué gototiene que ver con los decoradores?
Gui Prá
Esta es una gran serie pequeña de Adam Tornhill (era Petersen). Su libro completo está disponible. Este pequeño conjunto de patrones le llevará un largo camino en C
Clint Pachl
10

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 elección del lenguaje de programación es importante porque influye en el punto de vista de uno. Nuestros patrones asumen características de lenguaje de nivel Smalltalk / C ++, y esa elección determina qué se puede y qué no se puede implementar fácilmente. Si asumiéramos lenguajes de procedimiento, podríamos haber incluido patrones de diseño llamados "Herencia", "Encapsulación" y "Polimorfismo". De manera similar, algunos de nuestros patrones son compatibles directamente con los lenguajes orientados a objetos menos comunes. CLOS tiene múltiples métodos, por ejemplo, que disminuyen la necesidad de un patrón como Visitor. ( cursiva mía )

La oración en cursiva es la respuesta a su pregunta.

Vijay Mathew
fuente
7

Polimorfismo a través de devoluciones de llamada, por ejemplo, la qsortfunció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.

Edmund
fuente
Me gusta el uso de devoluciones de llamada. Puede crear una función de recorrido de estructura de datos general que ejecute una función de devolución de llamada en cada elemento.
onemasse
5

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;
}
Vlad
fuente
Sí, probablemente lo sean, pero ¿cómo implementaría normalmente uno de estos patrones en C?
onemasse
2
El mejor punto es que no debe implementar malos patrones de diseño (como singletons, también conocidos como variables globales) en C, o en cualquier lenguaje.
R .. GitHub DEJA AYUDAR A ICE
4
@R .: Realmente no creo que el singleton sea un mal patrón per se. Se puede ser útil y productivo en ciertos casos, puede ser perjudicial para la calidad del código en ciertos casos. Pero el desarrollador debe conocer las ventajas y desventajas de los patrones de diseño y usarlos con prudencia.
Vlad
2

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.

Peter G.
fuente
2

El sistema de archivos virtual es un ejemplo perfecto para aprender el patrón de diseño.

Sim Sun
fuente