94 votes

Existe-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 les traductions simples des modèles classiques de OO et ne mentionnez pas le périphérique de Duff. ;-)

92voto

CoolAJ86 Points 19341

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

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

12voto

Vijay Mathew Points 17155

Les Modèles de conception pourraient être considérées comme manquantes fonctionnalités de langage. L'Introduction de Modèles de Conception: les Éléments de Logiciels Orientés Objets Réutilisables états:

Le choix du langage de programmation est important, car il influe sur la de point de vue. Nos modèles supposent Smalltalk/C++-niveau fonctionnalités de langage, et ce choix détermine ce qui peut et ne peut pas être mise en œuvre facilement. Si nous avons pris en charge les langages procéduraux, nous peut avoir inclus des modèles de conception appelé "l'Héritage," "Encapsulation" et "le Polymorphisme." De même, certains de nos modèles sont pris en charge directement par le moins commun orienté objet les langues. CLOS a multi-méthodes, pour exemple, de réduire le besoin pour un motif comme Visiteur. (italiques de la mine)

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

7voto

Edmund Points 6479

Polymorphisme via des rappels, par exemple la fonction qsort la bibliothèque standard. Tout ce dont il a besoin est 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, de sorte qu'une routine générique puisse le traiter utilement. Par exemple, les appels en lecture, écriture, etc. sur un fichier ouvert ou un port réseau.

5voto

Vlad Points 23480

Oui il y en a. L’initialisation différée, le singleton, le pool d’objets, l’état d’objet, etc. s’implémentent facilement en C pur.

Exemple (initialisation différée)

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

2voto

Peter G. Points 8566

Les modèles de conception modélisent souvent des éléments d'un niveau équivalent à celui d'un environnement existant. Si vous prenez C avec sa bibliothèque standard comme environnement, un modèle de conception éminent est Orientation d'objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X