1. 便于分层设计:函数指针是引用,是间接层,或曰隔离层。它输出到上层,给上层用户用。函数实体是实现,在下层,给开发者用,实现者(软件工程师)关注。这就是简单的分层的概念了。上层用户想让一个函数所做的东西会变化时,我们只需要改变底层实现,并用函数指针指向新的实现就行了。
再精炼一下分层:分层的核心是对接口进行设计和实现。函数指针的作用就是提供不同实现的统一接口。
2. 利于系统抽象:只有存在多个类似的实体需要模拟、操作或控制时(这种情况很多)才需要抽象。多个类似的实体就是对象,抽象的结果就是类。在C里边,可以用函数指针数组完成这种抽象。如, fopen 就是一个例子。他可以打开文件。C里面将磁盘文件、串口、USB等诸多设备抽象为文件。
3. 降低耦合度以及使接口与实现分开:第1条中的解释已经说明了这一点。
再具体一下:
我曾搭建过一个嵌入式平台。其中的设备操作(硬件驱动)采用了多组函数指针数据,并进行了简单的封装,其结果是:
业务软件使用函数指针数组的封装函数访问设备。这个封装可展示为:
int DevOpen(char *strDevName);
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong);
int Read(int DevID, char* DataTo, int StartDevAddr, int DataLong);
int DevClose(int DevID);
这组抽象出来的函数,是一组语义清晰且稳定的上层接口,为上层的业务开发团队使用。底层的驱动层,各自实现自己的设备打开、读、写及关闭代码,然后,注册自己的设备到系统列表里。上层业务接可以使用了。期间的耦合在这里:
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong)
{
/* Error detecting. */
return DevWrite[ DevID ]( char* DataFrom, int StartDevAddr, int DataLong );
}
其中,DevWrite[ DevID ]就是一个函数指针数组:
int (*DevWrite)[ MAX_DEV_NUM ]( char*,int,int ) = {0};
里面放的就是多个设备的写的操作。其中包括:UART,RTC,WatchDog。EEPROM,DigitalInput,DigitalOutput,Key,LCD,LED。
好了。说的太多了。如需要学习,可邮件livefuture@163.com。
但愿对你有所帮助。
---------------------
作者:wujiangguizhen
来源:CSDN
原文:https://blog.csdn.net/wujiangguizhen/article/details/17153495
版权声明:本文为博主原创文章,转载请附上博文链接!