姓名:朱碩雅
學號:14020120008
轉載自http://www.hw100k.com/forum.php?mod=viewthread&tid=3437&extra= 有修改
【嵌牛導讀】:公司里做項目,嵌入式系統大大小小,到處都是。對API封裝有了整體把握,有利于提高自身的編碼質量。
【嵌牛鼻子】:嵌入式,封裝接口
【嵌牛提問】:封裝驅動或者抽象API的前期分析方法是什么?API的命名規則是什么?實現API的時候需要注意的地方?
【嵌牛正文】:
使用對象分析
首先強調一點,封裝API是一個復雜性和綜合性都較強的工作,不是一蹴而就。可能一些人會說,這有啥復雜的,不就是把功能包裝一下,加幾個參數完事。其實不然,一組API,應該能應對各種使用情況,應該是安全、高效、易使用的,也應該有統一的標準。
一個基本原則是處在使用者的角度出發,結合自身的特點,來分析這些問題。在對一個驅動或者某些功能封裝API的時候,應該先做豐富的調查和舉例,然后才開始后續工作。調查從功能本身出發,向你的下游(提供者)和上游(使用者)拓展,歸納出使用方法、使用方式和限制。
第一步是需要搞清楚你能使用的資源,即你的提供者的提供有那些功能和數據;
第二步是對你的調用者進行分析,他們的常用使用方法、使用步驟,以及是否有特殊需求等等;
第三步即對一二步的內容進行歸納總結,需要得出功能、用法和要求3個方面的內容。
功能:需要封裝的接口能實現哪些功能,各個功能之間有何調用關系;用法:接口怎么使用,是同步還是異步調用,是否需要記錄錯誤信息;要求:使用這組接口的要求,是否需要其他組件配合,是否有速率的限制等等。
所有這些調查工作最好是能把提供者和使用者召集起來一起開會討論,他們各自表述自己的功能和需求。但是這種情況比較難以實現,那么你至少應該把歸納出來的情況讓有經驗的人士來review。
完成這些工作后,應該對要定義的API有了初步的概念,即應該定義哪些接口,接口間的調用關系等等。如果有機會porting,那你是幸運的。當然也要注意修改不合理的地方。
抽象接口
抽象接口要有統一的標準,要保證一組API只做一類工作。一般來說,每組API均有共性,是有章可循的。這里介紹一種從功能角度來分類的抽象接口框架,包括:資源管理、狀態控制和數據傳輸。
資源管理,一般來說這類接口主要是完成入口和出口的資源分配和管理,比如:入口的工作,會創建對象,初始化變量,申請資源,句柄注冊等;出口的工作會有對象刪除,資源回收,句柄刪除等,所以這一類接口可以用以下的關鍵字來表述:initialize/uninitialized, register/ unregister,open/close等。
狀態控制,一般用于控制進程和狀態維護。常用:start、stop、suspend、resume、sleep等。
數據傳輸:get/set data,send/receive data,get/set status等。
這個框架能應對大部分設計。分析完設計對象的功能后,就可以按功能歸入對應框架。還有一點不要忽略,就是抽象接口函數參數不能太多,因為過多的參數不僅會增加調用時間,浪費資源,同時還很不方便使用。接口函數還要避免值傳遞,對于小型嵌入式系統來說尤為重要。
API命名
這個涉及到code rule ,每個公司都有自己的規定,就不多說了。但是應該把握的基本思想是API名稱意思明確,沒有歧義,參數順序合理,形參名稱直觀易懂。應該避免的是簡單的命名如write/read,因為這不僅讓使用者困惑,在多個接口的使用還容易產生沖突。C++中有namespace的區分,也要避免使用簡單的命名來污染命名空間。
接口實裝
寫程序的環節,是攻城獅最喜歡的,因為這是相對簡單和純粹的事情。主要就是代碼質量,關于代碼質量的書籍很多,這里也不累述。提一些注意點:
參數合理性判斷,以及對于非法值處理。
接口函數線程安全,以及接口的重入性。
使用的資源管理,申請的內存,打開的文件句柄,等都要正確釋放。
異常處理。
接口函數盡量避免值傳遞。
是否越界。