姓名:朱碩雅
學(xué)號:14020120008
轉(zhuǎn)載自http://www.hw100k.com/forum.php?mod=viewthread&tid=3437&extra= 有修改
【嵌牛導(dǎo)讀】:公司里做項(xiàng)目畸肆,嵌入式系統(tǒng)大大小小吮便,到處都是。對API封裝有了整體把握,有利于提高自身的編碼質(zhì)量溯捆。
【嵌牛鼻子】:嵌入式,封裝接口
【嵌牛提問】:封裝驅(qū)動或者抽象API的前期分析方法是什么脓鹃?API的命名規(guī)則是什么傻昙?實(shí)現(xiàn)API的時(shí)候需要注意的地方?
【嵌牛正文】:
使用對象分析
首先強(qiáng)調(diào)一點(diǎn)梳猪,封裝API是一個(gè)復(fù)雜性和綜合性都較強(qiáng)的工作麻削,不是一蹴而就〈好郑可能一些人會說呛哟,這有啥復(fù)雜的,不就是把功能包裝一下匿沛,加幾個(gè)參數(shù)完事扫责。其實(shí)不然,一組API逃呼,應(yīng)該能應(yīng)對各種使用情況公给,應(yīng)該是安全、高效蜘渣、易使用的淌铐,也應(yīng)該有統(tǒng)一的標(biāo)準(zhǔn)。
一個(gè)基本原則是處在使用者的角度出發(fā)蔫缸,結(jié)合自身的特點(diǎn)腿准,來分析這些問題。在對一個(gè)驅(qū)動或者某些功能封裝API的時(shí)候,應(yīng)該先做豐富的調(diào)查和舉例吐葱,然后才開始后續(xù)工作街望。調(diào)查從功能本身出發(fā),向你的下游(提供者)和上游(使用者)拓展弟跑,歸納出使用方法灾前、使用方式和限制。
第一步是需要搞清楚你能使用的資源孟辑,即你的提供者的提供有那些功能和數(shù)據(jù)哎甲;
第二步是對你的調(diào)用者進(jìn)行分析,他們的常用使用方法饲嗽、使用步驟炭玫,以及是否有特殊需求等等;
第三步即對一二步的內(nèi)容進(jìn)行歸納總結(jié)貌虾,需要得出功能吞加、用法和要求3個(gè)方面的內(nèi)容。
功能:需要封裝的接口能實(shí)現(xiàn)哪些功能尽狠,各個(gè)功能之間有何調(diào)用關(guān)系衔憨;用法:接口怎么使用,是同步還是異步調(diào)用袄膏,是否需要記錄錯誤信息巫财;要求:使用這組接口的要求,是否需要其他組件配合哩陕,是否有速率的限制等等平项。
所有這些調(diào)查工作最好是能把提供者和使用者召集起來一起開會討論,他們各自表述自己的功能和需求悍及。但是這種情況比較難以實(shí)現(xiàn)闽瓢,那么你至少應(yīng)該把歸納出來的情況讓有經(jīng)驗(yàn)的人士來review。
完成這些工作后心赶,應(yīng)該對要定義的API有了初步的概念扣讼,即應(yīng)該定義哪些接口,接口間的調(diào)用關(guān)系等等缨叫。如果有機(jī)會porting椭符,那你是幸運(yùn)的。當(dāng)然也要注意修改不合理的地方耻姥。
抽象接口
抽象接口要有統(tǒng)一的標(biāo)準(zhǔn)销钝,要保證一組API只做一類工作。一般來說琐簇,每組API均有共性蒸健,是有章可循的。這里介紹一種從功能角度來分類的抽象接口框架,包括:資源管理似忧、狀態(tài)控制和數(shù)據(jù)傳輸渣叛。
資源管理,一般來說這類接口主要是完成入口和出口的資源分配和管理盯捌,比如:入口的工作淳衙,會創(chuàng)建對象,初始化變量饺著,申請資源箫攀,句柄注冊等;出口的工作會有對象刪除瓶籽,資源回收匠童,句柄刪除等埂材,所以這一類接口可以用以下的關(guān)鍵字來表述:initialize/uninitialized, register/ unregister塑顺,open/close等。
狀態(tài)控制俏险,一般用于控制進(jìn)程和狀態(tài)維護(hù)严拒。常用:start、stop竖独、suspend裤唠、resume、sleep等莹痢。
數(shù)據(jù)傳輸:get/set data,send/receive data,get/set status等种蘸。
這個(gè)框架能應(yīng)對大部分設(shè)計(jì)。分析完設(shè)計(jì)對象的功能后竞膳,就可以按功能歸入對應(yīng)框架航瞭。還有一點(diǎn)不要忽略,就是抽象接口函數(shù)參數(shù)不能太多坦辟,因?yàn)檫^多的參數(shù)不僅會增加調(diào)用時(shí)間刊侯,浪費(fèi)資源,同時(shí)還很不方便使用锉走。接口函數(shù)還要避免值傳遞滨彻,對于小型嵌入式系統(tǒng)來說尤為重要。
API命名
這個(gè)涉及到code rule 挪蹭,每個(gè)公司都有自己的規(guī)定亭饵,就不多說了。但是應(yīng)該把握的基本思想是API名稱意思明確梁厉,沒有歧義冬骚,參數(shù)順序合理,形參名稱直觀易懂。應(yīng)該避免的是簡單的命名如write/read只冻,因?yàn)檫@不僅讓使用者困惑庇麦,在多個(gè)接口的使用還容易產(chǎn)生沖突。C++中有namespace的區(qū)分喜德,也要避免使用簡單的命名來污染命名空間山橄。
接口實(shí)裝
寫程序的環(huán)節(jié),是攻城獅最喜歡的舍悯,因?yàn)檫@是相對簡單和純粹的事情航棱。主要就是代碼質(zhì)量,關(guān)于代碼質(zhì)量的書籍很多萌衬,這里也不累述饮醇。提一些注意點(diǎn):
參數(shù)合理性判斷,以及對于非法值處理秕豫。
接口函數(shù)線程安全朴艰,以及接口的重入性。
使用的資源管理混移,申請的內(nèi)存祠墅,打開的文件句柄,等都要正確釋放歌径。
異常處理毁嗦。
接口函數(shù)盡量避免值傳遞。
是否越界回铛。