HaveFunWithEmbeddedSystem/Chapter2_C_与_C++/2.9_面向过程与面向对象.md

4.3 KiB
Raw Permalink Blame History

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++ 非常完整的继承了面向对象思想,并在语言层面提供了面向对象工具,包括:类、继承、多态、友元等。

练习

  1. 以身边事物为参考,举出父类和多个子类的例子,并说出哪些是属性,哪些是方法,哪里提现出了继承,覆盖和多态思想。