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);
....
};
用类似以上的结构,将数据和method打包起来。
值得一提的是,以上的这种组合形式,提供的operation基本上相当于OO中的public method。C语言本身不内建OO支持,所以没办法对方法定义一些
属性。然而,实际上,我们是可以找到对应于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)
水平有限,就写到这里吧。不对之处,如果有热心的朋友发现,还请指正,不甚感激。
来源:oschina
链接:https://my.oschina.net/u/158589/blog/59147