《C++ API 設計》ch5 API Style
API 分很多種 style,各有優缺跟取捨。
- C style
- Object Oriented C++ style
- Template style
- Data driven style
這種分類方式是以 C/C++ 系列區分,但我覺得在其他語言方面也有類似概念。
C style
一般 C function 們,通常會用 struct 跟一些命名規則來區別不同功能跟 component 等等。
類似的東西:PHP 那些 mysql_
開頭的 function 們。
讓 C++ 可以 call C API
有時候使用者是用 C++ 開發,而 C style 的 API 希望能給這樣的使用者使用。在此狀況下,C style API 需要:
- C API 可以用 C++ compiler 編過
- 用
extern "C"
處理 C++ 與 C 之間 linkage 的問題
同樣的 function 在 C compiler 跟 C++ 的 compiler 產生的 object file 中會以不同方式呈現,例如 C++ 有name decoration
,但 C 沒有。因此 C API 得用 extern “C” 包起來,讓 C++ compiler 知道這段應該要用 C style 的 link 方式。
1 |
|
Object Oriented C++ style
以物件導向為基礎的寫法。
類似的東西:PHP 的 mysqli
物件。
Template style
以 template 於 compile time 達到 static polymorphism──相同 interface 可支援多種 type,例如 STL。
相對物件導向的多型是在 runtime 做,使用 template 有較高的執行效率,但 compile 出來的檔案會比較大。因此,相對 code 大小較著重執行效能時可用 template,反之可用物件導向。
缺點之一是 template 的定義得放在 header,導致使用的程式需一起 compile template 的 header,但仍有些方式可以將 template 定義藏在 .cpp。另外,template 的 compile error 訊息很複雜,無論自己開發有什麼問題或者使用者使用時有何問題,複雜的 error message 讓人蠻頭大的。被害過…但至今還是沒搞懂…(欸)
Data driven style
interface 提供非常 general 的 function,實際上做什麼事由 input 決定。interface 大概像這樣:
Result DoCommand(string cmd, ArgList args)
Command()
內部 implement 會依據 cmd
決定要做什麼,args
則是對應 command 的參數,Result
則是回傳值。
例如 web service,使用者丟想做的命令跟參數給 web service,web service 再依據命令及參數回應。
由於 interface 非常 general,需要相對應的 general 的參數型態來傳這些參數,像上面的 Result
。在不強調 data type 的語言(weakly type language)像 python 中很好處理,但在 C++ 裡就要自己寫或用其他 library 提供的了,如 Qt 的 QVariant。
好處是 API 修改非常彈性,幾乎不需要動到 interface。壞處是單從 interface 看不出 API 提供的功能,因為太 general 了,這時候只能靠文件。