当前位置:天才代写 > tutorial > C语言/C++ 教程 > 感伤C语言中的面向工具思想

感伤C语言中的面向工具思想

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:507

副标题#e#

常常听见别人说面向工具的措施设计,以前也有上过面向工具措施设计这门课。但是不幸的是,这些都是以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就是实现了一个可进化的微观:它使得一个函数可以在不从头编译的环境下实现成果的添加!可是在最最早期的时候,也有蛮多人持阻挡立场,因为它用了函数指针。

#p#分页标题#e#

函数指针固然机动,可是由于它要会见内存两次才可以挪用到函数,第一次会见函数指针,第二次才是真正的函数挪用。它的效率是不如普通函数的。可是在一个不太苛刻的情况下,函数挪用自己就不怎么耗时,函数指针的机能又不是出格糟糕,利用函数指针其实是一个最好的选择。

可是函数指针除了机能,最贫苦的处所就是会导致措施的“支离破碎”。试想:在措施中,你读到一个函数指针的时候,假如你愣是不知道这个函数指针指向的是哪个函数,谁人感受真的很糟糕。(可以看后头的文章,要利用先进的措施框架,制止这样的环境)


#p#副标题#e#

三、Event和Message

看了上面的描写,相信各人几多有些大白为什么要利用Event和Message了。详细的函数挪用会带来许多的问题(固然从效率上讲,这样做是很好的)。为了提高措施的机动性,Event和Message的步伐发生了。用名字理会的步伐取代凡是的函数挪用,这样,假如两边对这样的理会是一致的话,就可以到达一个统一。不外Event和Message的浸染还不只仅是如此。

Event和Message尚有成立历程间通信的成果。历程将本身的动静发给“节制中心”(简朴的就是一个动静行列,和一个while轮回不绝的打动静行列的内容并执行),节制措施获得动静,分发给相应的历程,这样其他历程就可以获得这个动静并举办响应。

Event和Message是很机动的,因为你可以随时添加可能封锁一个历程,(仅仅需要添加分动员静的列表就可以了)Event和Message从措施实现大将我以为是一样的,只不外观念差异。Event多用于指一个行动,好比硬件产生了什么工作,需要挪用一个什么函数等等。Message多用于指一个指示,好比什么措施产生了什么操纵呼吁等等。

四、小结

其实编措施和写文章一样,都是先有一个提纲,然后逐步的富厚。先抽象化获得措施的骨架,然后再思量各个方面的其他内容:好比说措施极度的时候会产生什么问题?措施的这个处所的成果此刻还不完善,今后再完善会有什么问题?措施是不是可以扩展的?

 

    关键字:

天才代写-代写联系方式