面向过程
概念
面向过程是一种以过程为中心的编程思想,它是一种基础的顺序的思维方式,面向对象方法的基础实现中也包含面向过程思想。
特性:模块化 流程化
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开 发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
概念
面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
特性:抽象 封装 继承 多态
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
用“把大象装进冰箱”这个生动的例子分别做说明。
用面向过程的开发的流程如下(拢共三步):
1.制作一个数组作为“冰箱”,冰箱做好了
2.制作一个数组作为“大象“,对对象的描述放在数组里(大象的头、身体、四条腿、尾巴)
3.写一个“把大象放进冰箱的函数”,函数把”大象“和冰箱做为参数,函数内部把”大象“数组复制到”冰箱“并清空”大象“数组。调用这个函数完成把大象装入冰箱的工作。
用面向对象的开发的流程如下(拢共三步):
1.制作一个冰箱类,类里面放一个数组做为“冰箱的储存仓”。类里面制作一个“放置函数”,这个函数可以把给他的东西放到“冰箱的储存仓”。好冰箱做好了。
2.制作一个大象类,类里面用变量定义大象的描述(大象的头、身体、四条腿、尾巴),类里面制作一个“获取大象描述函数”,调用这个函数就可以把大象类里面的描述都收集起来并放到一个数组,然后返回数组,大象做好了。
3.使用冰箱类new一个“冰箱对象”,使用大象类new一个“大象对象”。
大象描述数组 = “大象对象”-调用->“获取大象描述函数”;
“冰箱对象”-调用->“放置函数”(大象描述数组);
1.数据安全性
面向过程:所有数据对外开放,任何函数都可以对这个共有数据做修改
面向对象:“冰箱”的数据放在自己类里面,私有化了,自由自己类的函数可以操作
2.代码设计思路不同
面向过程:直接操作数据,不绕弯,简单快速
面向对象:对于数据都要找到对应的拟物对象,模拟现实世界中处理数据的方法,凡事都要找的谁和谁之间相互关系。
3.可扩展性不同
面向过程:直接处理数据,需要扩展的时候直接在数据上做更改,比如给大象新增加“象牙”特征(导致数据增长),对象上面的面向过程例子,就需要对所有三步中对所以设计到数组的部分做代码修改。
面向对象:容易扩展并不影响其他对象的代码,比如同样给大象新增加“象牙”特征,只需给大象类增加一个“象牙”描述成员变量,然后在“获取大象函数”中自动会分析数据大小并生成合适的数组,同时冰箱类也不用修改任何代码。(当然完成这样的效果需要,就增加了类里面函数的复杂度,好在这个虽然复杂了,但是通用)
4.耦合性不同
面向过程:把所有数据和功能函数放在一起,没有分成你的和我的,造成模块和模块之间耦合
面向对象:按照对象个你分成了你的或我的,我和你之间交互处理数据,都通过类的公共函数来处理
5.复用性和易维护
比如现在要做一个新冰箱,新冰箱比旧冰箱增加颜色的属性,并且颜色可以随时修改,看面向过程和对象分别怎样处理。
面向过程:再制作一个新的数组作为新冰箱,同时定义个全局变量用于描述冰箱的颜色,修改冰箱颜色直接修改这个变量即可。
面向对象:定义一个新冰箱类并继承旧冰箱类,然后在新冰箱类里面增加颜色描述变量,并对外提供修改颜色函数。
从两者对“新”冰箱的处理方法上来看,面向对象可以看到“面向对象语言”可以更好的利用现有的代码。且在功能增加中,以“物化”的冰箱对象来编写代码,使得这个代码直观易懂。
面向过程语言适用于大多数的硬件芯片编程和部分软件核心功能库的编程。相对于面向对象编程语言,面向过程语言的优点如下:编译生成的二进制文件更小、执行效率更高、开发语言简洁、稳定性高。
面向过程语言适用于各类软件编程以及部分高级芯片编程。由于应用软件要实现非常多的功能,各个功能之间关系复杂。一般软件的总代码行数在1万到10万行之间。因此使用一个合适的面向对象编程语言非常必要,这里面向对象编程语言的优点就体现出来了,比如:以面向对象建立软件中的各个模型,使复杂逻辑关系变得清晰明了、代码易读易懂、易于维护和扩展等。
如果你没有搞明白什么是面向对象编程,即便你用的是面向对象编程语言编写的代码,也不能完全算是面向对象编程,也只是停留在面向对象编程的表面。那么什么是面向对象编程思想呢?
“面向对象思想”:是采用模型(对象)来描述客观世界实际事物的一种思想。一般在软件开发中是指用代码建立客观世界中的各类事物的模型。并编写函数来实现模型本身的功能,以及模型与模型之间的关系处理代码。因此把软件开发中的所有逻辑关系分类并合并为了“代码模型”之间的逻辑关系。因此才使得面向对象编程中即便代码复杂但是逻辑关系清晰明了。在面向对象编程中“代码模型”可以创造出多个模型实例。这个模型实例被叫做“对象”。总结为一句话“面向对象开发就是对现实事物的建模”。
使用面向对象语言举例面向对象编程,这里用做一个“冰箱模型”来举例:
**fridge.h
class Fridge {
//建立一个冰箱模型
public://模型对外提供操作接口函数
Fridge();//构造函数,功能是初始化模型中的数据
int put(int pos, char object);//把东西放到冰箱中的指定位置
char fatch(int pos);//从冰箱指定位置取东西
private://模型私有数据,只能用模型自己的函数来直接操作
char container[100];//冰箱容器
};
**fridge.cpp
#include "fridge.h"
Fridge::Fridge() {
memset(container, 0, 100);
}
int Fridge::put(int pos, char object) {
container[pos] = object;
//这里可以判断是否可以存入,并返回处理结果编号
return 0;
}
char Fridge::fatch(int pos) {
char ret = container[pos];
container[pos] = 0;//取出清零
return ret;
}
**main
#include "fridge.h"
int main() {
Fridge fridge;//建立一个模型对象,在建立的时候自动调用“构造函数”
fridge.put(0, 'a');//使用模型实体对象,把‘a’存入冰箱
char temp = fridge.fetch(0);//使用模型实体对象,从冰箱位置0拿出东西
return 0;
}
了解了“面向对象编程思想”的实质以后可以发现,即便是c语言也可以面向对象开发。虽然c语言中没有class这样的面向对象构架语法,但是可以使用c语言的开发知识来构建相应的功能。可用方法如下:
方法1:
使用结构体作为一个“代码模型”,在结构体中实现模型所具有的变量和函数。
方法2:
使用单个c语言文件作为一个“代码模型”,一个c语言文件包含一个h文件和一个c文件。一个c语言文件中的c文件定义模型的私有变量(static)和功能函数。在c语言文件中的h文件中声明(extern)模块对外提供的函数接口。不用担心浪费c语言文件,实际开发中面向对象语言中的模型class一般也单独占用一个文件。为了在调用模型函数的时候,能明确表明这个函数是这个模型的,一般在模块的成员函数名字前面加上特定的标注字符。(因为c语言中没法建立模型的“对象”)。软件图形界面开发库GTK+就是用C语言以这样的面向对象思想实现方法来建立的。同样使用“冰箱模型”来举例做一个c语言版本的面向对象设计:
**fridge.h
extern void fridge_init();
extern int fridge_put(int pos, char object);
extern char fridge_fetch(int pos);
**fridge.c
#include "fridge.h"
static char container[100];//冰箱容器
void fridge_init() {
memset(container, 0, 100);
}
int fridge_put(int pos, char object) {
container[pos] = object;
return 0;
}
char fridge_fetch(int pos) {
char ret = container[pos];
container[pos] = 0;//取出清零
return ret;
}
**main
#include "fridge.h"
int main() {
fridge_init();
fridge_put(0, 'a');
char temp = fridge_fetch(0);
return 0;
}