目录
模块化编程就是把我们的一整个项目,分成很多模块(比如一个学生成绩查询可以分为,登陆,查询,修改保存,退出等模块)。俺用C写程序可能经历了下面几个过程的进步
第一
把程序都写在一个while循环里,相信大部分人刚入门都是这样子
第二.面向过程
学会使用多个源文件(.c 文件和 .h 文件)
一个程序工程包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明该模块
这样在别的文件,只要使用#include“xxxx.h”,就可以调用xxxx.c里写的函数,下面做一个最简单的例子
头文件led.h
#ifndef _LED_h
#define _LED_h
void LED_Open(); //开启LED灯
void LED_Close(); //关闭LED灯
#endif
c语言中条件编译相关的预编译指令
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用,判断某个宏是否被定义
要调用的源文件
void LED_Open()
{
//亮灯代码
}
void LED_Close()
{
//关灯代码
}
主函数main()
#include "LED.h"
int main(void)
{
LED_Open(); //开启LED灯
while(1);
}
第三.面向对象
面向对象编程和面向过程编程的区别总结 - smallzhen - 博客园
第二的写法自然是属于模块化编程,这应该是面向过程的模块化,以功能为划分标准,我也用这种方法写了很久程序。后来学习了linux驱动,看了内核的代码,那种面向对象方式的模块化编程让俺惊叹。所有模块都做成一个结构体向上传递,上层只需要对下面传上来的结构体分配设置注册就可以,层次感十分明,整个linux内核都使用这种方法。
写久了感觉第二有一个问题,就是写大型的模块交叉很多的项目,比如一个菜单切换不同的功能页面,面向过程的写法有些难,条例很难理清,当然也可能是我的编程能力不够原因导致。
后来看了高手用面向对象的方式编程,感叹竟然可以如此条理清晰层次分明,把每部分分成一个个对象, 对象各自拥有自己的数据和操作,只提供一个接口,上层通过这个接口就能全盘掌控这个对象的数据和操作,当我需要修改一些东西,只需要修改特定的对象,对象外面的基本不用修改,特别好维护。
现象对象:
现象对象编程很简单,就是把整个项目按实体进行划分为一个个具体的对象,用结构体封装起来,使用时进行
第一步:构造需要封装的结构体
第二步:用结构体实例化对象,并对结构体内部数据已经函数进行设置
第三步:把对象注册,提供上层使用
如何注册如链接所示
35.简单的注册函数_LingLinTianShang的博客-CSDN博客
下层提供个上层使用的接口是一个由同一结构体构成的数组或者结构体链表,上层通过接口找到对应对象的结构体,就能使用到里面的数据和函数。
比如把屏幕显示抽象出来作为上层的一个对象,下层的对象可以有:移动设备的LCD、PC机等,这些下层设备都具有类似的属性,像素描点、亮度……它们也各自封装成独立的对象向上注册,屏幕显示这个上层对象就可以根据具体的情况使用对象,实现LCD、PC机屏幕等设备的显示切换
向上传递的可以是数组,也可以使用链表,数组的大小就被限制了,一旦数组项使用完毕,需要增加就需要修改,空余的数组项也占据内存,链表则可以灵活增加减少,就是比较难写
52.模块化编程的准备2(链表)_LingLinTianShang的博客-CSDN博客
当需要维护的时候,仅仅需要对具体对象进行修改,假如需要增加功能,比如显示操作要增加CRT屏幕,直接新增一个对象并注册进接口链表,上层对象就可以直接使用