Steve McConnell在《code complete》中提到一個概念:programming in a language 和 programming into a language的區別。咱們作本身的項目時,正確的方法應該是,先對問題充分考察,而後分析,肯定主要數據結構和主要算法,最後將本身的這些思想,用某種編程語言來實現。
言歸正傳,說說Linux Kernel中如何用C來部分的實現面向對象思想。算法
這篇文章初略的談一談方法的封裝。編程
咱們知道,面向對象的核心思想就是封裝(或者說打包), 把相關聯的數據結構和方法一塊兒封裝起來,那麼從此,傳遞該「類」對象時,其方法也數據結構
被一同傳遞。Linux Kernel中如何實現這種數據和方法的封裝呢?以下:
struct A
{
int data;
char data2;
....
A_operation *op;
};編程語言
struct A_operation
{
void (*start)(struct A* a, int para1);
void (*compute)(struct A*, int para1, int para2);
....
};spa
用相似以上的結構,將數據和method打包起來。設計
值得一提的是,以上的這種組合形式,提供的operation基本上至關於OO中的public method。C語言自己不內建OO支持,因此沒辦法對方法定義一些code
屬性。然而,實際上,咱們是能夠找到對應於OO中public和prviate方法屬性的實現的。在此,先再次強調,不要被語言限制!program into a language instead of in a language!對象
在Linux Kernel中,不少重要的對象,都稱爲xxx descriptor。一般它須要的一些方法,會寫在xxx結構聲明的同一個文件中。那麼其private方法(僅供本身使用,而外界不須要看到的方法)一般就聲明爲了static方法;而public方法,要麼用EXPORT_SYMBOL導出,要麼如上做爲一個struct的一個組成部分。經過這種編程級別的約定(而非語言級別的限制),在Linux Kernel中,咱們看以一窺OO思想。繼承
OO中方法的覆蓋?OO中類的繼承?
在Linux Kernel的實現中,我沒看到明顯的繼承思想,覆蓋卻是有些。其類的組成,擴展,清一色用的是組合的形式。好比你要定義本身的一個char device,若是是不加考慮的直接用繼承,那麼你回獲得一個龐大的複雜的,難以維護的系統。而實際上,一般你只須要改寫其file operation就能夠了。這種設計策略有點相似於strategy pattern。(參考Head First Design Patterns中的strategy pattern)ip
水平有限,就寫到這裏吧。不對之處,若是有熱心的朋友發現,還請指正,不甚感激。