C語言的設計模式有哪些?

或者說設計思想。尤其是開源軟體中。


謝邀。談到用語言,更多是語言慣用法,而非設計模式,他們是不同層面的概念,MVC那就扯得更遠了,設計模式是針對應用top down下來,而非一種特定的語言,如果為語言而模式,為模式而模式那就是緣木求魚。狹義的設計模式是針對面向對象這類語言,C 用的啰嗦一點,模擬出對象關係,使用GOF總結的設計模式是沒問題的,但關係如果整地過於複雜就違背C語言精幹的特點,就不要用C了。廣義的是針對一種編程範式中的模式,象C這種命令式語言,模擬函數式編程還是力有未逮,函數式里的模式就用不來。

針對用C寫kernel, 有高人總結出一系列模式,共三篇文章,可以欣賞一下。後兩篇鏈接在第一篇文章里

http://lwn.net/Articles/336224/

C的慣用法主要集中在macro, 用好了會感覺代碼清晰,重複很少。自己在工作中總結吧。

順便再推薦一本神書 C語言介面與實現。


C語言的牛逼泛型模式(需要成對使用):

AllInstanciatedGenericTypes.h

#define ELEMENT_TYPE int
#define CONTINAER_TYPE IntList
#include "GenericListTemplate.h"
#undef CONTAINER_TYPE
#undef ELEMENT_TYPE

AllInstanciatedGenericTypes.c

#define ELEMENT_TYPE int
#define CONTINAER_TYPE IntList
#include "GenericListTemplate.c"
#undef CONTAINER_TYPE
#undef ELEMENT_TYPE


吐槽一下,設計模式挺好一東西,被一堆良莠不齊的計算機書搞得變了味。

個人覺得設計模式本身和語言沒有必然的聯繫。模式只是一些先行者總結出來解決某類問題的比較優化的辦法 ,沒什麼高深的,完全不必貴族化和神秘化。

主場上有很多故作高深的設模式書,能把明白的看得不明白了。還有國外翻譯過來的水土不服的例子,害人不淺。

順便說一下:深入淺出的IT書,才是好的IT書。少數封面上一堆大師推薦,資深人員編寫的國內IT書,仔細一看七拼八湊讓人看不懂的,千萬不要買,不是用戶智商問題,是寫書質量問題。

入門的程序員還是要把基礎打打好,模式是針對編程經驗相對豐富,遇到過問題的,才會引起共鳴。原來解決問題可以這樣,這樣會帶來很多潛在的好處,基礎設計的代價是值得的。

多年以後回頭看C語言,我喜歡它的簡明,還有相對OO語言的那種自由奔放的感覺,並非它適合折騰所謂的設計模式。許多設計模式在OO下更具優勢 。

不要過多糾結設計模式,看得明白看,看不明白扔一邊。給你舉個例子。

說我和另一個老程序員齊頭並進搞2個類似項目,溝通比較少,若干個月後兩個人代碼交叉複審碰頭一看,每個人做的基礎設施,類的架構,數據存取方法都是趨同的,在優化的過程中,大家都追求最優解,自己的解決問題的方法,適合具體問題的所謂模式,才是最好的模式。

不要過多糾結設計模式,不學沒事。


C不是OO語言,但編程中可以應用一些OO思想。

比如對象的概念,C++的class就是struct的升級版,所以在C中一個struct變數可以視為一個對象實例。

比如有一個玩家對象結構體struct Player,內有屬性HP。繼承玩家的,有戰士和法師。

那麼可以這麼寫:

struct Player {

int HP;//血量

};

struct Warrior {

struct Player base;

int Attack;//攻擊力

int Defensive;//防禦力

};

struct Mage {

struct Player base;

int MP;//魔法值

int Range;//施法範圍

};

//玩家掛了嗎?

int Player_IsDead(struct Player* player) {

return (player-&>HP==0) ? 1 : 0;

}

//吃血

void Player_DrinkRedBottle(struct Player* player, int bottle_level) {

if( bottle_level == 1 ) player-&>HP += 100;//小瓶

else if( bottle_level == 2 ) player-&>HP += 500;//大瓶

}

struct Warrior w;

struct Mage m;

//戰士沒掛就吃個小血瓶

if( !Player_IsDead((struct Player*)w) ) {

Player_DrinkRedBottle((struct Player*)w, 1);

}

//法師沒掛就吃個大血瓶

if( !Player_IsDead((struct Player*)m) ) {

Player_DrinkRedBottle((struct Player*)m, 1);

}

這種寫法不如C++的方便,缺乏足夠的語法檢查,但也算夠用了。

C另外一個很實用的東西就是函數指針,用回調的方式可以實現很多東西,比如插件架構。

這麼寫C,看起來遠不如直接用C++方便。但是C++特性太多,即使有經驗的人也可能陷入過設計中。寫程序,著眼點應該是解決業務問題,根據業務進行思考。C更像一部手動檔,雖然有點麻煩,但是用熟了省油。

多看一些C庫,很容易掌握C的一些慣用寫法。比如glib 、apr都寫得很漂亮。


設計模式是和語言無關的(至少關係不大)。

只不過C語言更喜歡裸奔。


The Universe of Discourse : Design patterns of 1972


我想了半天,貌似有這麼本書:

Object-Oriented Programming With ANSI-C

http://www.cs.rit.edu/~ats/books/ooc.pdf


通常所說的「設計模式」,實際針對的是現代的 OO 語言(Smalltalk, C++, Java, C# 等),從來沒有聽說過其它範式的編程語言(eg. 過程式,函數式)有什麼設計模式的。

當然,如果你把 C 當作 OO 語言用,然後再引用設計模式什麼的……那就另當別論了。


模式是有代價的,一味的追求模式,違背了C語言的初衷。。。。


寫文章的模式「議論文」,「說明文」,「散文」等等等等等。

這跟你用漢語還是英語有特別大的關係么。

模式都是表達解決問題的通用思路,跟用什麼語音描述關係不是特別大。


轉載摘錄——「 講到設計模式,人們首先想到的語言就是c#或者是java,最不濟也是c++,一般來說沒有人會考慮到c語言。其實,我認為設計模式就是一種基本思想,過度美化或者神化其實沒有必要。其實閱讀過linux kernel的朋友都知道,linux雖然自身支持很多的文件系統,但是linux自身很好地把這些系統的基本操作都抽象出來了,成為了基本的虛擬文件系統。」


可以使用函數指針


那是C++嗎


推薦閱讀:

面向對象、面向服務、面向組件三種編程模式有什麼區別?分別適用於哪些領域的開發?
Swift code will run on Google's Fuchsia OS

TAG:開源軟體 | 編程語言 | C編程語言 | 設計模式 |