Gibt es irgendwelche “Entwurfsmuster” in C? [closed]

Lesezeit: 5 Minuten

Ich weiß, dass Entwurfsmuster im Allgemeinen etwas mit der OO-Programmierung zu tun haben, aber haben Sie ein Muster, das Sie oft verwenden, wenn Sie C programmieren?

Ich interessiere mich nicht für einfache Übersetzungen der klassischen OO-Muster und erwähne bitte nicht Duffs Gerät. 😉

Benutzeravatar von coolaj86
coolaj86

Mein Favorit ist die „Patterns in C“-Reihe von Adam Tornhill:

Außerdem: Ich denke immer an goto als tolles Werkzeug des armen Mannes für das Dekorateurmuster.

Aktualisieren: Ich würde die Verwendung sehr empfehlen Rost (rust-lang.org) anstelle von C, es sei denn, Sie müssen c verwenden. Rust hat alle Vorteile von c, einschließlich Geschwindigkeit und Binärbibliothekskompatibilität mit c, aber der Compiler übernimmt einen Großteil der Komplexität, um sicherzustellen, dass der Code speichersicher ist und keine Datenrennen enthält. Es ist auch portabel, verfügt über eine Standardbibliothek für allgemeine Aufgaben und ist viel einfacher für verschiedene Designmuster zu programmieren.

  • Könnten Sie näher erläutern, was goto hat mit Dekorateuren zu tun?

    – Gui Pra

    14. August 2015 um 16:48 Uhr

  • Dies ist eine großartige kleine Serie von Adam Tornhill (ehemals Petersen). Seine komplettes Buch ist verfügbar. Dieser kleine Satz von Mustern wird Sie in C weit bringen.

    – Clint Pachl

    31. Oktober 2017 um 10:56 Uhr

Design Patterns könnten als fehlende Sprachmerkmale angesehen werden. Die Einführung von Entwurfsmustern: Elemente wiederverwendbarer objektorientierter Software besagt:

Die Wahl der Programmiersprache ist wichtig, weil sie die eigene Sichtweise beeinflusst. Unsere Muster setzen Sprachfunktionen auf Smalltalk/C++-Ebene voraus, und diese Wahl bestimmt, was einfach implementiert werden kann und was nicht. Wenn wir von prozeduralen Sprachen ausgegangen wären, hätten wir möglicherweise Entwurfsmuster namens „Vererbung“, „Kapselung“ und „Polymorphismus“ aufgenommen. Ebenso 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 Visitor verringern. (Kursiv von mir)

Der Satz in Kursivschrift ist die Antwort auf Ihre Frage.

Polymorphismus über Callbacks, zB die der Standardbibliothek qsort Funktion. Alles, was es braucht, ist eine Möglichkeit, zwei Elemente zu vergleichen, und es kann ein Array davon sortieren.

Sie können viel ausgefeilter sein, indem Sie Sätze von Funktionen (vtables) verwenden, um die relevanten Eigenschaften eines Typs darzustellen, damit eine generische Routine ihn sinnvoll verarbeiten kann. Beispielsweise rufen die Lese-, Schreib- usw. Aufrufe eine offene Datei oder einen Netzwerkport auf.

  • Ich mag die Verwendung von Rückrufen. Sie können eine allgemeine Funktion zum Durchlaufen von Datenstrukturen erstellen, die eine Callback-Funktion für jedes Element ausführt.

    – eine Masse

    6. November 2010 um 14:11 Uhr

Benutzeravatar von src
Quelle

Von der Spitze meines Kopfes

Vlads Benutzeravatar
Vlad

Ja, das gibt es. Lazy Initialization, Singleton, Object Pool, Object State etc. sind einfach in purem C zu implementieren.

Beispiel (träge 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;
}

  • Ja, das sind sie wahrscheinlich, aber wie würden Sie normalerweise eines dieser Muster in C implementieren?

    – eine Masse

    6. November 2010 um 14:14 Uhr

  • Der bessere Punkt ist, dass Sie sollte nicht Implementieren Sie schlechte Entwurfsmuster (wie Singletons, auch bekannt als globale Variablen) in C oder einer anderen Sprache.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. November 2010 um 16:00 Uhr

  • @R.: Ich glaube wirklich nicht, dass Singleton per se ein schlechtes Muster ist. Es kann in bestimmten Fällen nützlich und produktiv sein, kann in bestimmten Fällen schädlich für die Codequalität sein. Sondern der Entwickler muss die Vor- und Nachteile der Designmuster kennen und sie mit Bedacht einsetzen.

    – Vlad

    6. November 2010 um 16:29 Uhr


Benutzeravatar von Peter G
Peter g.

Design Patterns modellieren oft Dinge, die nur eine Ebene von dem entfernt sind, was eine vorhandene Umgebung bietet. Wenn Sie C mit seiner Standardbibliothek als Umgebung nehmen, ist die Objektorientierung ein hervorragendes Entwurfsmuster.

  • Ja, das sind sie wahrscheinlich, aber wie würden Sie normalerweise eines dieser Muster in C implementieren?

    – eine Masse

    6. November 2010 um 14:14 Uhr

  • Der bessere Punkt ist, dass Sie sollte nicht Implementieren Sie schlechte Entwurfsmuster (wie Singletons, auch bekannt als globale Variablen) in C oder einer anderen Sprache.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    6. November 2010 um 16:00 Uhr

  • @R.: Ich glaube wirklich nicht, dass Singleton per se ein schlechtes Muster ist. Es kann in bestimmten Fällen nützlich und produktiv sein, kann in bestimmten Fällen schädlich für die Codequalität sein. Sondern der Entwickler muss die Vor- und Nachteile der Designmuster kennen und sie mit Bedacht einsetzen.

    – Vlad

    6. November 2010 um 16:29 Uhr


Benutzeravatar von nhahtdh
nhahtdh

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

1420870cookie-checkGibt es irgendwelche “Entwurfsmuster” in C? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy