如何架构一个系统?比较常见的是将系统进行分层设计,在C语言中,函数指针是用来实现软件分层的重要手段.
一个大型软件是一定要分层写的,一是便于项目管理中人力的分配,底层用少量水平高的人写,越往上层人数越多,到最上层编程人员可能只需要写回调函数就行了;二是分层后,软件的bug被隔离开,出现一个bug,不至于在整个系统中到处找,到处修改,分层后只需先定位是哪层,再修改相应函数.
一般所说的软件分层是从模块(或函数)上分层(目的是便于编写和调试),上层可直接调用下层函数;而操作系统(OS)与应用的分层是真正的分层,即应用只能通过陷入(中断)得到OS的服务,应用是不能直接调用OS的内核函数的.
分层的特点是:上层调用下层,但不能调用下下层,即不能跨层调用;如何分层,即定义某层所应提供的服务是一个难点。一旦定义好,就要为这层精心设计几个调用点(即调用入口),上层只能通过这几个入口来请求服务.如果写成上层调用下下层,甚至最底层,这会导致修改一个地方需要改很多地方,且相互牵制,这个工作量及复杂度令人难以忍受,最后的结局是:不是系统崩溃,就是人崩溃.
举几个例子:
- 金融软件系统(后台)通常分为两层:平台层,应用层。平台层负责解决通迅和数据库接口,应用层负责业务流程。平台层recv营业网点send来的数据后,将其存入共享内存区,然后fork一个应用;应用从共享内存区读取数据,处理业务(可能调用平台层提供的数据库API),将结果send给平台层,平台层再将结果send回营业网点.
- CORBA是一种中间件技术规范.如果想用CORBA来架构系统,我们除了要购买厂商的CORBA产品(相当于平台层)之外,还要程序员编写相应的CORBA应用程序,这些应用程序其实就是回调函数,供平台调用(Dispatch).