web-dev-qa-db-fra.com

Y a-t-il des "modèles de conception" en C?

Je sais que les modèles de conception sont généralement liés à la programmation OO, mais avez-vous des modèles que vous utilisez souvent lorsque vous programmez C?

Je ne suis pas intéressé par de simples traductions des modèles classiques OO et s'il vous plaît ne mentionnez pas l'appareil de Duff. ;-)

74
onemasse

Mon préféré est la série "Patterns in C" par Adam Petersen :

Aussi: je pense toujours à goto comme un outil de grand homme pauvre pour le modèle de décorateur.

Mise à jour : je recommande fortement d'utiliser Rust ( Rust-lang.org ) plutôt que C, sauf si vous devez utiliser c. Rust a tous les avantages de c, y compris la vitesse et la compatibilité des bibliothèques binaires avec c, mais le compilateur gère une grande partie de la complexité pour garantir que le code est sûr en mémoire et ne contient pas de courses de données. Il est également portable, possède une bibliothèque standard pour les tâches courantes et est beaucoup plus facile à programmer pour divers modèles de conception.

76
CoolAJ86

Les modèles de conception peuvent être considérés comme des fonctionnalités linguistiques manquantes. L'introduction de Design Patterns: Elements of Reusable Object-Oriented Software déclare:

Le choix du langage de programmation est important car il influence son point de vue. Nos modèles supposent des fonctionnalités de langage de niveau Smalltalk/C++, et ce choix détermine ce qui peut ou ne peut pas être implémenté facilement. Si nous supposions des langages procéduraux, nous aurions pu inclure des modèles de conception appelés "héritage", "encapsulation" et "polymorphisme". De même, certains de nos modèles sont pris en charge directement par les langages orientés objet les moins courants. CLOS dispose de plusieurs méthodes, par exemple, qui réduisent le besoin d'un modèle tel que Visitor. ( italique mine )

La phrase en italique est la réponse à votre question.

9
Vijay Mathew

Oui il y en a. L'initialisation paresseuse, le singleton, le pool d'objets, l'état d'objet, etc. sont facilement implémentés en C. pur.

Exemple (initialisation paresseuse)

#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;
}
5
Vlad

Polymorphisme via rappels, par ex. la fonction qsort de la bibliothèque standard. Tout ce dont il a besoin, c'est d'un moyen de comparer deux éléments, et il peut en trier un tableau.

Vous pouvez être beaucoup plus sophistiqué que cela en utilisant des ensembles de fonctions (vtables) pour représenter les propriétés pertinentes d'un type afin qu'une routine générique puisse le traiter de manière utile. Par exemple, la lecture, l'écriture, etc. appelle un fichier ouvert ou un port réseau.

5
Edmund
3
src

Les modèles de conception modélisent souvent des choses qui ne sont qu'à un niveau de ce que propose un environnement existant. Si vous prenez C avec sa bibliothèque standard comme environnement, un modèle de conception éminent est l'orientation des objets.

1
Peter G.

Le système de fichiers virtuel est un exemple parfait pour apprendre le modèle de conception.

1
Sim Sun