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-Chttp://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