2010-11-06 37 views
53

我知道設計模式通常是與OO編程相關的東西,但是當您編程C時,您是否有一些經常使用的模式?C中有沒有「設計模式」?

我對古典OO模式的簡單翻譯不感興趣,請不要提及達夫的設備。 ;-)

回答

56

我最喜歡的是系列中的 「用C模式」,由Adam Petersen

另外:我總是認爲goto作爲一個偉大的窮人的裝飾模式的工具。

+7

你能詳細說明goto與裝飾器有什麼關係嗎? – 2015-08-14 16:48:56

+0

這是Adam Tornhill(彼得森)的精彩小系列。他的[完整書籍](https://leanpub.com/patternsinc)可用。這一小組模式將在C中佔據很長一段路。 – 2017-10-31 10:56:33

4

是的,有。延遲初始化,單身,對象池,對象狀態等,很容易在純C.

例(延遲初始化)實施

#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

是的,他們可能是,但你通常如何在C中實現這些模式之一? – onemasse 2010-11-06 14:14:29

+0

添加例如用於延遲初始化 – Vlad 2010-11-06 14:29:32

+2

更好的一點是,你**應該不是**落實不好的設計模式(如單身,又名全局變量)在C,或與此有關的任何語言。 – 2010-11-06 16:00:11

1

設計模式往往是從什麼現有環境只是一個級別車型的東西提供。如果你將C的標準庫作爲環境,一個傑出的設計模式是面向對象。

4

通過回調的多態性,例如,標準庫的qsort函數。它所需要的只是一種比較兩個元素的方法,它可以對它們進行排序。

通過使用函數集(vtable)來表示一個類型的相關屬性,以便通用例程可以有效地處理它,您可以比這更復雜。例如,讀取,寫入等在打開的文件或網絡端口上調用。

+0

我喜歡使用回調。您可以創建一個通用數據結構遍歷函數,該函數在每個元素上執行回調函數。 – onemasse 2010-11-06 14:11:23

7

設計模式可被視爲缺少語言功能。的Design Patterns: Elements of Reusable Object-Oriented Software的簡介指出:

編程語言的選擇是 重要的,因爲它影響着一個人的 的觀點。我們的模式假設 Smalltalk/C++級別的語言功能, 和那個選擇決定什麼可以 和不能輕易實現。 如果 我們假定程序語言,我們 可能包含名爲「繼承」,「封裝」, 和「多態性」的設計模式 。同樣,我們的一些 模式直接支持 不太常見的面向對象的 語言。 CLOS具有多種方法,例如 示例,這樣可以減少對訪問者等 模式的需求。 (我加

這句話用斜體字是回答你的問題。

0

虛擬文件系統是學習設計模式很好的例子。