感触C语言中的面向对象思想
经常听见别人说面向对象的程序设计,以前也有上过面向对象程序设计这门课。可是不幸的是,这些都是以C++,甚至VC++为基础的。而更加不幸的是,多年以来我一直是一个C的使用者。在学校的时候,我主要做的是硬件上的驱动层,和底层功能层。
在工作以后,又做的是手机上的软件开发,所有这些都是和C离不开的。尽管我不得不说,C++是一门很好的语言,但是它的编译速度,代码效率,编译后的代码大小都限制了它在嵌入式上的应用。(虽然现在的嵌入式CPU越来越快,内存容量变大,我觉得用C++也应该没有什么问题。这使我觉得似乎是嵌入式编译器的限制。尽管菲利普和TI如同都有C++的编译器,但是似乎没人用这个。难道是太贵了?但不论怎样说,嵌入式应用中,C语言的普遍使用是一定的)
那么在面向过程的时代产生的C语言是否使用面向对象的思想呢?我认为是一定可以的,C++不过是在语言级别上加入了对对象的支持,同时提供了丰富的对象库。而在C语言下,我们只好自力更生了。
一、 面向对象思想的目的是框架化,手段是笼统
相信很多人都明白面向对象讲了什么:类,笼统类,继承,多态。但是是什么起因促使这些概念的产生呢?
打个比如说:你去买显示器,然而显示器的品牌样式是多种多样的,你在买的过程中发生的事情也是不可预测的。对于这样的事情,我们在程序语言中如何去形容呢。面向对象的思想就是为理解决这样的问题。编写一个程序(甚至说是一个工程),从无到用是困难的,从有到丰富是更加困难的。面向对象将程序的各个行为化为对象,而又用笼统的办法将这些对象归类(笼统),从而将错综复杂的事情简化为几个主要的有机组合(框架化)。
其实我们的身边很多东西都是这样组成的:比方说电脑:电脑是由主板,CPU加上各种卡组成的。这就是一个框架化。而忽略不同的CPU,不同的主板,不同的声卡,网卡,显卡的区别,这就是笼统。再比方说现在的教育网:是由主核心节点:清华,北大,北邮等几个,而后是各个子节点,依次组成了整个教育网网络。
所以我觉得面向对象的编程思想就是:一个大型工程是分层次结构的,每层又由笼统的结构连接为整体(框架化),各个笼统结构之间是彼此独立的,可以独立进化(继承,多态)。层次之间,结构之间各有统一的通讯方式(通常是消息,事件机制)。
二、以前C语言编程中常用的“面向对象”方法
其实C语言诞生以来,人们就想了很多办法来表现“面向对象”的思想。下面就来说说我所知道的方法。
1.宏定义:
有的人不禁要问,宏定义怎样扯到这里来了,我们可以先看一个简单的例子:
#define MacroFunction Afunction
而后在程序里面你调用了大量的AFunction,但是有一天,你忽然发现你要用BFunction了,(不过AFunction又不能不要,很有可能你以后还要调用),这个时候,你即可以#define MacroFunction Bfunction来达到这样的目的。
2.静态的入口函数,保证函数名相同,利用标志位调用子函数:
这样的典型应用很多,比方说网卡驱动里面有一个入口函数Nilan(int FunctionCode,Para*)。具体的参数是什么记不清楚了。不过NiLan的主体是这样的:
Long Nilan(int FunctionCode,Para*)
{
Switch(FunctionCode)
{
Case SendPacket:
send(….)
Case ReceivePacket:
receive(…)
…..
}
写到这里大家明白什么意思了吧。保证相同的函数名就是说:网卡驱动是和pNA+协议栈互连的,那么如何保证pNA+协议栈和不同的驱动都兼容呢,一个简单的办法就是仅仅使用一个入口函数。通过改变假如函数的参数值,来调用内部的各个函数。
这样的做法是可以进化的:假如以后想调用新的函数,添加相应的函数参数值就好了。假如我们将网卡驱动和pNA+协议栈看作两个层的话,我们可以发现:层与层之间的互连接口是很小的(这里是一个入口函数),一般是采用名字解析的办法而不是具体的函数调用(利用FunctionCode调用函数,Nilan仅仅实现名字解析的功能)――!接口限制和名字解析
接口限制:层与层之间仅仅知道有限的函数
名字解析:层与层之间建立共同的名字与函数的对应关系,之间利用名字调用功能。?
3.CALLBACK函数
我觉得这是C语言的一个创举,尽管它很简单,就象如何把鸡蛋竖起来一样,但是你假如没想到的话,依然是一个难题。假如说静态入口函数实现了一个可管理的宏观的话,CallBack就是实现了一个可进化的微观:它使得一个函数可以在不重新编译的情况下实现功能的增加!但是在最最早期的时候,也有蛮多人持反对态度,由于它用了函数指针。
函数指针尽管灵活,但是因为它要访问内存两次才可以调用到函数,第一次访问函数指针,第二次才是真正的函数调用。它的效率是不如普通函数的。但是在一个不太苛刻的环境下,函数调用本身就不怎样耗时,函数指针的性能又不是特别糟糕,使用函数指针其实是一个最好的选择。
但是函数指针除了性能,最麻烦的地方就是会导致程序的“支离破碎”。试想:在程序中,你读到一个函数指针的时候,假如你愣是不知道这个函数指针指向的是哪个函数,那个感觉真的很糟糕。(可以看后面的文章,要使用先进的程序框架,避免这样的情况)
三、Event和Message
看了上面的形容,相信大家多少有些明白为什么要使用Event和Message了。具体的函数调用会带来很多的问题(尽管从效率上讲,这样做是很好的)。为了提高程序的灵活性,Event和Message的办法产生了。用名字解析的办法代替通常的函数调用,这样,假如双方对这样的解析是一致的话,即可以达到一个统一。不过Event和Message的作用还不仅仅是如此。
Event和Message还有建立进程间通信的功能。进程将自己的消息发给“控制中心”(简单的就是一个消息队列,和一个while循环不断的取消息队列的内容并执行),控制程序得到消息,分发给相应的进程,这样其余进程即可以得到这个消息并进行响应。
Event和Message是很灵活的,由于你可以随时增加或者者关闭一个进程,(仅仅需要增加分发消息的列表即可以了)Event和Message从程序实现上将我觉得是一样的,只不过概念不同。Event多用于指一个动作,比方硬件发生了什么事情,需要调用一个什么函数等等。Message多用于指一个指示,比方什么程序发生了什么操作命令等等。
四、小结
其实编程序和写文章一样,都是先有一个提纲,而后慢慢的丰富。先笼统化得到程序的骨架,而后再考虑各个方面的其余内容:比方说程序极端的时候会发生什么问题?程序的这个地方的功能现在还不完善,以后再完善会有什么问题?程序是不是可以扩展的?
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 感触C语言中的面向对象思想