HaveFunWithEmbeddedSystem/Chapter2 C与C++/2.9 面向过程与面向对象.md

50 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2.9 面相过程与面向对象
在学习了函数和文件之后,我们可以考虑构建一个复杂的系统,一个经典的例子是学生信息管理系统。接下来我们考虑通过不同的设计理念来构建这样的系统。
## 2.9.1 面向过程的设计
我们分析,学生管理系统应该由权限管理系统,输入系统、显示系统、打印系统、数据存储系统和处理系统构成。这样,从总体上,将大系统划分成了多模块,对于每个模块,我们仍然有办法将其划分为多个子系统,直到将系统划分得足够小为止。
这些子系统之间不可能完全独立,他们之间通过模块间接口相互耦合。对于显示系统而言,他需要通过接口调用处理系统提供的功能,处理系统需要先调用数据存储系统获得数据,然后进行处理。最后,处理系统接口返回,由显示系统继续运行,将处理完的数据显示到屏幕上。
这样的实现方式,将某个功能(比如按学生成绩排名)分解为多个过程。过程之间相互依赖,一个过程的实现依赖于另外的一个或几个过程。这是典型的面向过程设计。
面向过程设计有很多优点,非常适用于时序系统,并且发展了很多设计理念和技术,现今仍在使用。
## 2.9.2 面向对象设计
一旦系统变得更加复杂,基于模块化的过程设计将变得困难。最明显的就是过程间复杂的调用关系。从简单的 A 调用 B到 A 调用 BA 调用 CA 调用 DB 调用 CB 调用 DC 调用 D。只不过增加了两个模块调用关系就成了指数级增长。
其他的难度在于团队间的协作。随着计算机的发展,软件规模越来越大,一个软件系统很难由一两个人完成开发。传统的面向过程开发使得模块间接口错综复杂。
由此演变出了面向对象开发技术。面向对象技术以类和对象为基础,传统的过程调用演变为对象间的交互。
class 的概念与现实中的类概念一致,它是具有相同特性群体的统称,比如人,鸟,鱼。类并不指具体的个体,而是类似特性的合集,是抽象的概念。鸟类具有一些共同特性,比如有翅膀和羽毛,能够进行长途或短距离飞翔(不要跟我提鸵鸟(╬▔皿▔)凸,而且鸵鸟的祖先是会飞的)。在编程语言层面,鸟类的翅膀和羽毛可以被成为属性,而飞翔能力被称作方法。
| Name | Value | Type |
| ------ | ----- | -------- |
| Colour | Red | Property |
| Wing | 2 | Property |
| Fly | ----- | Function |
类是一个抽象的概念,当我们说,鸟,鱼,人的时候,并不指具体的哪条鱼,哪个人,而是是指具备这一类相同属性和方法的集合。
但当我们提到某个具体的人,如张老师,小王时,等同于访问这个类里某个具体的对象。产生具体对象的过程,被称作类的实例化。
类是可以被继承的,被继承的类称作父类,继承的类称作子类。子类对父类进行了更细致的划分,例如松、杉、杨、榆、样、槐将树划分成了更细的子类。
子类通常继承了父类的一些熟悉或方法,也有可能有不同的地方,比如子类可以扩充父类的属性和方法,也可以覆盖父类的方法。
每个对象都可以有公开,保护或者私有属性和方法等资源。这些资源可以被其他对象访问,子类对象访问,或者只能被自己访问。
这些访问限制,属性和方法的聚合,提供了更好的封装特性,这使得模块化效果更好,对大型项目来说,多人协调开发更加容易。同时,类这种抽象,使得项目模型更加简洁,能够设计出低耦合系统。这都使得项目更易维护和扩展。
## 2.9.3 C++
C++ 是面向对象思想的最佳实现。它扩充了 C 语言并降低了二次学习的成本。C++ 非常完整的继承了面向对象思想,并在语言层面提供了面向对象工具。在 C++ 类内部,可以有多个同名方法,但他们的参数个数或参数类型不同,这一特性,被称作多态。
## 练习
以身边事物为参考,举出父类和多个子类的例子,并说出哪些是属性,哪些是方法,哪里提现出了继承,覆盖和多态思想。