主题:结构体内嵌指针实现分层
(1)程序为什么要分层?因为复杂程序东西太多一个人搞不定,需要更多人协同工作,于是乎就要分工。要分工先分层,分层之后各个层次由不同的人完成,然后再彼此调用组合共同工作。
(2) 本程序要完成一个计算器,我们设计了2个层次:上层是framework.c,实现应用程序框架;下层是cal.c,实现计算器。实际工作时cal.c是直接完成工作的,但是cal.c中的关键部分是调用的framework.c中的函数来完成的。
(3)先写framework.c,由一个人来完成。这个人在framework.c中需要完成计算器的业务逻辑,并且把相应的接口写在对应的头文件中发出来,将来别的层次的人使用这个头文件来协同工作。
cal.h
#ifndef __CAL_H__
#define __CAL_H__
typedef int (*pfunc) (int,int); //重命名函数指针
//结构体是用来做计算器的,计算器工作时需要原材料
struct cal_t
{
int a;
int b;
pfunc p1;
};
//函数声明
int calculator(const struct cal_t *p);
#endif
framework.c
#include "cal.h"
//framework.c中应该写实际业务代码
//计算器函数
int calculator(const struct cal_t *p)
{
return p->p1(p->a,p->b); //返回 用函数指针调用执行文件来计算的值
}
(4)另一个人来完成cal.c,实现具体计算器;这个人需要framework层的工作人员提供头文件来工作(但是不需要framework.c)。
cal.c
#include <stdio.h>
#include "cal.h"
int add(int a, int b) //+
{
return a + b;
}
int minus(int a, int b) // -
{
return a - b;
}
int ride(int a, int b) //*
{
return a * b;
}
int division(int a, int b) // /
{
return a / b;
}
int main(void)
{
int ret = 0;
struct cal_t mycal;
mycal.a = 12;
mycal.b = 4;
mycal.p1 = add;
ret = calculator(&mycal); //调用函数传参进行计算并把返回值给ret
printf("ret = %d\n",ret); //输出ret来验证
}
(5)总结:
第一:本章与上章函数指针调用执行文件实现的是同一个任务,但是采用了不同的程序架构。
第二:对于简单问题来说,上章的不分层反而容易理解,反而简单;本章的分层代码不好理解,看起来有点把简单问题复杂化的意思。原因在于我们这个任务本身确实是个简单的任务,而简单的任务就应该用简单的方法处理。我们为什么明明知道错还要这样做?目的是为了理解这种分层的思路和方法。
第三:分层写代码的思路是:有多个层次结合来完成任务,每个层次专注各自不同的领域和任务;不同层次之间用头文件来交互。
第四:分层之后上层为下层提供服务,上层写的代码是为了在下层被调用。
第五:上层注重业务逻辑,与我们最终的目标直接关联,而没有具体干活的函数。
第六:下层注重实际干活的函数,注重为上层提供填充变量,并且将变量传递给上层中的函数(其实就是调用上层提供的接口函数)来完成任务。
第七:下层代码中其实核心是一个结构体变量(譬如本例中的struct cal_t),写下层代码的逻辑其实很简单:第一步先定义结构体变量;第二步填充结构体变量;第三步调用上层写好的接口函数,把结构体变量传给他即可。