2010-11-06 12 views
53

Wiem, że wzorce projektowe są na ogół czymś, co jest związane z programowaniem OO, ale czy masz jakiś wzorzec, którego często używasz podczas programowania C?Czy są jakieś "wzorce projektowe" w C?

Nie interesują mnie proste tłumaczenia klasycznych wzorów OO i proszę nie wspominać o urządzeniu Duffa. ;-)

Odpowiedz

56

Moim ulubionym jest "Wzorce w C" przez Adam Petersen:

Ponadto: zawsze myślę o goto jako doskonałym narzędziu dla biednego człowieka dla wzoru dekoratora.

+7

Czy mógłbyś wyjaśnić, co 'goto' ma wspólnego z dekoratorami? –

+0

To świetny mały serial Adama Tornhilla (był Petersen). Jego [pełna książka] (https://leanpub.com/patternsinc) jest dostępna. Ten mały zestaw wzorów zajmie Ci dużo czasu w C. –

4

Tak, są. Leniwe inicjowanie, Singleton, basen obiektu, stan obiektu itd. Są łatwo wdrożyć w czystym C.

przykładu (leniwe inicjowanie)

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

Tak, prawdopodobnie są, ale w jaki sposób typowo wdrożysz jeden z tych wzorów w C? – onemasse

+0

dodany przykład dla lazy init – Vlad

+2

Lepszym rozwiązaniem jest to, że ** nie powinieneś ** implementować złych wzorców projektowych (takich jak single, zmienne globalne) w C lub w jakimkolwiek innym języku. –

1

Wzorce projektowe modelu często rzeczy, które mają tylko jeden poziom z jakiego istniejącym środowisku oferuje. Jeśli weźmiesz C ze standardową biblioteką jako środowiskiem, wybitny wzór projektu to Orientacja obiektu.

4

Polimorfizm za pośrednictwem wywołań zwrotnych, np. funkcja standardowej biblioteki: qsort. Wszystko, czego potrzebuje, to sposób na porównanie dwóch elementów i może uporządkować ich szereg.

Możesz być o wiele bardziej wyrafinowany, używając zestawów funkcji (vtables) do reprezentowania istotnych właściwości typu, dzięki czemu standardowa procedura może z pożytkiem go przetworzyć. Na przykład odczyt, zapis itp. Wywołuje otwarty plik lub port sieciowy.

+0

Podoba mi się korzystanie z połączeń zwrotnych. Można utworzyć ogólną funkcję przechodzenia struktury danych, która wykonuje funkcję wywołania zwrotnego dla każdego elementu. – onemasse

7

Wzorce projektowe mogą być wyświetlane jako brakujące funkcje językowe. Wprowadzenie Design Patterns: Elements of Reusable Object-Oriented Software stwierdza:

Wybór języka programowania jest ważny, ponieważ wpływa własnego punkt widzenia. Nasze wzory zakładają: Smalltalk/C++ - funkcje języka poziomu, i ten wybór określa, co może być i nie można go łatwo zaimplementować. Jeśli założyliśmy języki proceduralne, możemy może zawierać wzorce projektowe o nazwie "Dziedziczenie", "Enkapsulacja", i "Polimorfizm". Podobnie, niektóre z naszych wzorów są obsługiwane bezpośrednio przez w mniej popularnych językach obiektowych . CLOS ma wiele metod, dla przykładu , co zmniejsza potrzebę wzoru , takiego jak Visitor. (kursywa kopalnia)

Zdanie kursywą jest odpowiedzią na twoje pytanie.

0

Wirtualny system plików jest doskonałym przykładem do nauki wzorzec projektowy.

Powiązane problemy