Gibt es in C „Designmuster“? [geschlossen]

80

Ich weiß, dass Entwurfsmuster im Allgemeinen mit der OO-Programmierung verbunden sind, aber haben Sie ein Muster, das Sie häufig verwenden, wenn Sie C programmieren?

Ich bin nicht an einfachen Übersetzungen der klassischen OO-Muster interessiert und bitte erwähne nicht Duffs Gerät. ;-);

onemasse
quelle

Antworten:

83

Mein Favorit ist die "Patterns in C" -Serie von Adam Tornhill :

Außerdem: Ich denke immer an gotoein großes Werkzeug für arme Leute für das Dekorationsmuster.

Update : Ich würde dringend empfehlen, Rust ( rust-lang.org ) anstelle von C zu verwenden, es sei denn, Sie müssen c verwenden. Rust bietet alle Vorteile von c, einschließlich Geschwindigkeit und Kompatibilität der Binärbibliothek mit c. Der Compiler übernimmt jedoch einen Großteil der Komplexität, um sicherzustellen, dass der Code speichersicher ist und keine Datenrassen enthält. Es ist auch portabel, verfügt über eine Standardbibliothek für allgemeine Aufgaben und ist für verschiedene Entwurfsmuster viel einfacher zu programmieren.

coolaj86
quelle
9
Könnten Sie näher erläutern, was gotomit Dekorateuren zu tun hat?
Gui Prá
Dies ist eine großartige kleine Serie von Adam Tornhill (war Petersen). Sein komplettes Buch ist verfügbar. Diese kleine Reihe von Mustern wird Sie in C.
Clint Pachl
10

Entwurfsmuster können als fehlende Sprachfunktionen angesehen werden. Die Einführung von Entwurfsmustern: Elemente wiederverwendbarer objektorientierter Software besagt:

Die Wahl der Programmiersprache ist wichtig, da sie den eigenen Standpunkt beeinflusst. Unsere Muster setzen Sprachfunktionen auf Smalltalk / C ++ - Ebene voraus, und diese Auswahl bestimmt, was einfach implementiert werden kann und was nicht. Wenn wir prozedurale Sprachen angenommen hätten, hätten wir möglicherweise Entwurfsmuster mit den Namen "Vererbung", "Kapselung" und "Polymorphismus" aufgenommen. In ähnlicher Weise werden einige unserer Muster direkt von den weniger verbreiteten objektorientierten Sprachen unterstützt. CLOS verfügt beispielsweise über mehrere Methoden, die die Notwendigkeit eines Musters wie "Besucher" verringern. ( meins kursiv )

Der kursive Satz ist die Antwort auf Ihre Frage.

Vijay Mathew
quelle
7

Polymorphismus über Rückrufe, zB die qsortFunktion der Standardbibliothek . Alles, was es braucht, ist eine Möglichkeit, zwei Elemente zu vergleichen, und es kann ein Array von ihnen sortieren.

Sie können viel ausgefeilter sein, indem Sie Funktionssätze (vtables) verwenden, um die relevanten Eigenschaften eines Typs darzustellen, damit eine generische Routine ihn sinnvoll verarbeiten kann. Beispielsweise ruft das Lesen, Schreiben usw. eine geöffnete Datei oder einen Netzwerkport auf.

Edmund
quelle
Ich mag die Verwendung von Rückrufen. Sie können eine allgemeine Datenstruktur-Durchlauffunktion erstellen, die für jedes Element eine Rückruffunktion ausführt.
Onemasse
5

Ja, das gibt es. Lazy Initialisierung, Singleton, Objektpool, Objektstatus usw. lassen sich leicht in reinem C implementieren.

Beispiel (verzögerte Initialisierung)

#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
quelle
Ja, das sind sie wahrscheinlich, aber wie würden Sie normalerweise eines dieser Muster in C implementieren?
Onemasse
2
Der bessere Punkt ist, dass Sie keine schlechten Entwurfsmuster (wie Singletons, auch bekannt als globale Variablen) in C oder einer anderen Sprache implementieren sollten .
R .. GitHub STOP HELPING ICE
4
@R.: Ich denke wirklich nicht, dass Singleton per se ein schlechtes Muster ist. Es kann in bestimmten Fällen sinnvoll und produktiv sein, kann für die Codequalität in bestimmten Fällen schädlich sein. Der Entwickler muss jedoch die Vor- und Nachteile der Entwurfsmuster kennen und sie mit Bedacht einsetzen.
Vlad
2

Entwurfsmuster modellieren häufig Dinge, die nur eine Ebene von dem entfernt sind, was eine vorhandene Umgebung bietet. Wenn Sie C mit seiner Standardbibliothek als Umgebung verwenden, ist die Objektorientierung ein herausragendes Entwurfsmuster.

Peter G.
quelle
2

Das virtuelle Dateisystem ist ein perfektes Beispiel für das Erlernen des Entwurfsmusters.

Sim Sun.
quelle