Czy są jakieś „wzorce projektowe” w C? [Zamknięte]

84

Wiem, że wzorce projektowe są generalnie czymś, co jest związane z programowaniem obiektowym, ale czy masz jakiś wzorzec, którego często używasz podczas programowania C?

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

onemasse
źródło

Odpowiedzi:

86

Moim ulubionym jest cykl „Patterns in C” Adama Tornhilla :

Poza tym: zawsze myślę o gotowielkim narzędziu dla biednych dla wzoru dekoratora.

Aktualizacja : Zdecydowanie polecam używanie Rusta ( rust-lang.org ) zamiast C, z wyjątkiem przypadków, gdy wymagane jest użycie c. Rust ma wszystkie zalety c, w tym szybkość i zgodność bibliotek binarnych z c, ale kompilator obsługuje większość złożoności, aby zapewnić, że kod jest bezpieczny w pamięci i nie zawiera wyścigów danych. Jest również przenośny, ma standardową bibliotekę do typowych zadań i jest znacznie łatwiejszy w programowaniu dla różnych wzorców projektowych.

coolaj86
źródło
9
Czy mógłbyś wyjaśnić, co gotoma wspólnego z dekoratorami?
Gui Prá
1
To świetny mały serial autorstwa Adama Tornhilla (był Petersen). Jego cała książka jest dostępna. Ten mały zestaw wzorów zajmie Ci długą drogę w C.
Clint Pachl
10

Wzorce projektowe mogą być postrzegane jako brakujące funkcje językowe. Stan „Wprowadzenie wzorców projektowych: elementy oprogramowania obiektowego wielokrotnego użytku” :

Wybór języka programowania jest ważny, ponieważ wpływa na punkt widzenia. Nasze wzorce zakładają cechy języka na poziomie Smalltalk / C ++, a wybór ten określa, co można, a czego nie można łatwo zaimplementować. Gdybyśmy przyjęli języki proceduralne, moglibyśmy uwzględnić wzorce projektowe zwane „dziedziczeniem”, „hermetyzacją” i „polimorfizmem”. Podobnie, niektóre z naszych wzorców są obsługiwane bezpośrednio przez mniej popularne języki obiektowe. Na przykład CLOS ma wiele metod, które zmniejszają potrzebę stosowania wzorca, takiego jak Visitor. ( moja kursywa )

Zdanie napisane kursywą to odpowiedź na twoje pytanie.

Vijay Mathew
źródło
7

Polimorfizm poprzez wywołania zwrotne, np qsort. Funkcja biblioteki standardowej . Wszystko, czego potrzebuje, to sposób na porównanie dwóch elementów i posortowanie ich tablicy.

Możesz być o wiele bardziej wyrafinowany, używając zestawów funkcji (vtables) do reprezentowania odpowiednich właściwości typu, tak aby ogólna procedura mogła go użytecznie przetworzyć. Na przykład odczyt, zapis itp. Wywołuje otwarty plik lub port sieciowy.

Edmund
źródło
Lubię używać callbacków. Możesz utworzyć ogólną funkcję przechodzenia przez strukturę danych, która wykonuje funkcję zwrotną na każdym elemencie.
onemasse
5

Tak, są. Leniwa inicjalizacja, singleton, pula obiektów, stan obiektu itp. Są łatwo zaimplementowane w czystym C.

Przykład (leniwa inicjalizacja)

Vlad
źródło
Tak, prawdopodobnie tak jest, ale jak zazwyczaj zaimplementowałbyś jeden z tych wzorców w C?
onemasse
2
Lepszą rzeczą jest to, że nie powinieneś implementować złych wzorców projektowych (takich jak singletony, inaczej zmienne globalne) w C ani w żadnym innym języku.
R .. GitHub ZATRZYMAJ SIĘ NA LODZIE
4
@R .: Naprawdę nie uważam, że singleton sam w sobie jest złym wzorcem. W niektórych przypadkach może być użyteczna i produktywna, w niektórych przypadkach może być szkodliwa dla jakości kodu. Jednak programista musi znać zalety i wady wzorców projektowych i rozsądnie ich używać.
Vlad
2

Wzorce projektowe często modelują rzeczy, które są tylko o jeden poziom od tego, co oferuje istniejące środowisko. Jeśli weźmiesz C ze standardową biblioteką jako środowisko, wyróżniającym się wzorcem projektowym jest Object Orientation.

Peter G.
źródło
2

Wirtualny system plików to doskonały przykład do nauki wzorca projektowego.

Sim Sun
źródło