嵌入式軟件開發(fā) - C語言程序設(shè)計

這里分享一些關(guān)于C語言程序設(shè)計方面的心得吧逻澳,一點淺見,見笑見笑暖呕。

C語言也可以實現(xiàn)面向?qū)ο笤O(shè)計

面向?qū)ο笫且环N方法斜做,雖然C語言不是面向?qū)ο笳Z言也可以做到面向?qū)ο笤O(shè)計。首先來看看對象主要包含什么:

  1. 屬性集合
  2. 方法集合
  3. 方法里能訪問對象上下文

我們先看看屬性湾揽,C語言里的結(jié)構(gòu)體就能實現(xiàn)這一點瓤逼,一個結(jié)構(gòu)體定義一些字段,這些字段的集合是不是就能看做是屬性集合了库物。

typedef struct Person_st
{
    char name[20];
    int age;
}Person_t

然后再來看看2霸旗,我們認為按約定定義好一些方法,說這個就是對象的方法就行戚揭,面向?qū)ο蟛皇欠堑谜f同過"."或"->"調(diào)用才是對象方法吧诱告。比如:

PersionSetName();
PersionSetAge();

這里先不考慮函數(shù)里面實現(xiàn)的問題,我們可以約定這么定義對象的方法『對象名+方法名』民晒。當(dāng)然你想要的『->』調(diào)用也是可以的精居。

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)();
    void (*setAge)();
}Person_t

Person persion;
person->setName();
person->setAge();

通過函數(shù)指針來實現(xiàn)锄禽,事實上Linux內(nèi)核中就是這么做的。

最后再來看3箱蟆,如何訪問對象上下文的問題沟绪,在C++或其他面向?qū)ο笳Z言中,直接在方法內(nèi)通過this來訪問對象是天經(jīng)地義的事空猜,但是在C語言由于本身不支持就需要我們費些功夫來實現(xiàn)了绽慈。

方式1

typedef struct Person_st
{
    char name[20];
    int age;
}Person_t

void PersonSetName(Person_t *p, const char *name);
void PersonSetAge(Person_t *p, int age);

方式2

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)(Person_t *p, const char *name);
    void (*setAge)(Person_t *p, int age);
}Person_t

我們主動把對象傳進給函數(shù)。這里我們就能在C語言上進行面向?qū)ο蟮某绦蛟O(shè)計了辈毯。至于方式1和方式2哪個好用坝疼,我個人喜歡用方式1,一個是不需要初始化函數(shù)指針谆沃,再者就是結(jié)構(gòu)體占用的內(nèi)存更小钝凶。

模塊化設(shè)計

其實程序設(shè)計和任務(wù)分解一樣,你把一個大的功能不斷細分唁影,把一個大模塊分解成小模塊耕陷,最終無數(shù)個小模塊組成一個完整的程序。每次面對的都是一個個小功能据沈,一者是當(dāng)前需要面對的情況簡單了哟沫,一者就是需要思考的點少了,不會出現(xiàn)無從下手的情況锌介。有很多將程序設(shè)計方面的書這里就不多細說了嗜诀。

非阻塞系統(tǒng)設(shè)計

另外說一下自己關(guān)于程序設(shè)計的一點感悟吧,非阻塞系統(tǒng)設(shè)計孔祸。

這里先說接口隆敢,一般接口分為兩種,一種是阻塞的崔慧,等到所有數(shù)據(jù)處理完成再返回拂蝎,一種是非阻塞的,調(diào)用接口時只是相當(dāng)于一個觸發(fā)信號惶室,等處理完成一般通過回調(diào)函數(shù)返回匣屡。

這里分析一下兩種方式,第一種接口拇涤,設(shè)計簡單,使用也比較簡單誉结,都是線性思維的鹅士,但是帶來的影響就是整個系統(tǒng)會阻塞,不說單片機阻塞了就相當(dāng)于把整個系統(tǒng)阻塞了惩坑,就算是用多線程也會帶來線程同步的問題掉盅,而線程同步是最容易出問題也是出了問題最不好查的地方也拜。

第二種,所有的接口都是非阻塞的趾痘,需要等待獲取結(jié)果的通過回調(diào)函數(shù)來返回慢哈。不好的地方就是這時候思維不是線性的,先調(diào)用接口然后再在回調(diào)返回的地方再處理結(jié)果永票。好處就是你不會因為處理一項事物而阻塞了其他事物的執(zhí)行卵贱,系統(tǒng)的響應(yīng)實時性是高的。

特別是在多線程系統(tǒng)中侣集,假設(shè)所有的邏輯都是非阻塞的也就沒必要再開線程了键俱,也就根本不需要考慮線程間同步的問題。當(dāng)然這里是需要一點小技巧的世分,因為系統(tǒng)里總有耗時的任務(wù)编振,原則上是只把耗時的任務(wù)交給線程處理,在處理完成有結(jié)果的時候把處理結(jié)果回調(diào)時又切回去主線程臭埋,對于使用接口的人來說完全不需要考慮線程同步的問題踪央,只需要處理好業(yè)務(wù)邏輯就行了,對于開發(fā)效率的提升是非常明顯的瓢阴。有興趣的可以看看Node.js的事件驅(qū)動畅蹂,非阻塞IO模型。Node.js的接口就完全是異步的炫掐,而且居然連能創(chuàng)建線程的接口都沒有魁莉。

最小暴露原則

最小暴露原則說的就是,僅在頭文件中暴露外部需要使用的類型募胃、宏旗唁、函數(shù)和全局變量,所有不需要給外部使用的都不放在對外公開的頭文件中痹束,比如我定義一個模塊會是這樣的:

Person.c
Person.h
PersonInternal.h

所有不想對外暴露的接口检疫,僅對內(nèi)暴露的接口都定義在Inter.h頭文件中。

  • 私有實現(xiàn)

對象中如果有些字段覺得沒必要暴露出來的可以選擇私有實現(xiàn)祷嘶,如下定義一個PersonPri_t類型屎媳,但是在頭文件里面只有聲明,實現(xiàn)定義在.c文件中论巍。

typedef struct PersonPri_st PersonPri_t;

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)();
    void (*setAge)();

    PersonPri_t *pri;
}Person_t
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烛谊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘉汰,更是在濱河造成了極大的恐慌丹禀,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異双泪,居然都是意外死亡持搜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門焙矛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葫盼,“玉大人,你說我怎么就攤上這事村斟∑兜迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵邓梅,是天一觀的道長脱盲。 經(jīng)常有香客問我,道長日缨,這世上最難降的妖魔是什么钱反? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匣距,結(jié)果婚禮上面哥,老公的妹妹穿的比我還像新娘。我一直安慰自己毅待,他們只是感情好尚卫,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尸红,像睡著了一般吱涉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上外里,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天怎爵,我揣著相機與錄音,去河邊找鬼盅蝗。 笑死鳖链,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墩莫。 我是一名探鬼主播芙委,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狂秦!你這毒婦竟也來了灌侣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤裂问,失蹤者是張志新(化名)和其女友劉穎侧啼,沒想到半個月后玖姑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡慨菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戴甩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片符喝。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甜孤,靈堂內(nèi)的尸體忽然破棺而出协饲,到底是詐尸還是另有隱情,我是刑警寧澤缴川,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布茉稠,位于F島的核電站,受9級特大地震影響把夸,放射性物質(zhì)發(fā)生泄漏而线。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一恋日、第九天 我趴在偏房一處隱蔽的房頂上張望膀篮。 院中可真熱鬧,春花似錦岂膳、人聲如沸誓竿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筷屡。三九已至,卻和暖如春簸喂,著一層夾襖步出監(jiān)牢的瞬間毙死,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工娘赴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留规哲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓诽表,卻偏偏與公主長得像唉锌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竿奏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 從三月份找實習(xí)到現(xiàn)在袄简,面了一些公司,掛了不少泛啸,但最終還是拿到小米绿语、百度、阿里、京東吕粹、新浪种柑、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,239評論 11 349
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,720評論 1 142
  • 裂·息封 黎明前微醺的瑣碎光線 黃昏后黯淡的細小云絲 應(yīng)該是溫潤 和很多很多沉靜的波動 你的眸目唇齒 應(yīng)該是那些的...
    GEM小甜心閱讀 249評論 0 0
  • 米蘭·昆德拉一直在尋找隱藏在真實生活背后的荒誕的意義匹耕,即便是在他寫出《生活在別處》之后聚请,他也沒曾想放棄過這種努力。...
    何鵬在簡書閱讀 941評論 0 1