面向对象编程范式

1.概述

1.1.面向对象编程的核心诉求

软件中变更是不可避免的,没办法预估到的变更没法控制,但是面对可以预估到的变更要做好设计来预防,达到即使遇到变更只做有限范围的修改,而不做大范围的修改这种理想效果。面向对象编程最核心的诉求就是根据场景设计出合理的类来力求实现这个效果。

《面向对象编程范式》和《设计模式》之间的区别:

前者是世界观,后者是方法论。

1.2.面向对象的世界观

面向对象编程是有职责对象之间的协作,在面向对象的世界观里世界是由一个一个的节点组成的,每个节点都有自己的职责,节点之间以通信的方式进行协作,构成了整个世界的运行。以此就完全不同于面向过程编程里函数之间的协作,区分开了两种世界观。

因此面向对象的世界中最重要的三点:

  1. 职责
  2. 通信
  3. 协作

1.职责:

单个节点是某一类职责的抽象集合,具有静态的数据职责(属性)、动态的行为职责(方法)。

2.通信:

方法调用。

3.协作

就是一起合作的意思。

4.举个例子:

我打网约车,

叫车的场景,我这个节点调用了司机这个节点的开车功能。

上车的场景,我这个节点调用了车这个节点的开门功能。

以此带入类推,会发现这个世界的运转其实都可以抽象为不同节点之间以通信的方式进行协作。

2.类和对象

还是看刚才的打车场景:

明显可以看到,我和司机之间具有相同的属性,姓名、身高、性别,只是各自的属性值不同;我和司机之间具有一些相同的功能,吃饭、睡觉。我和车之间则是属性、功能皆迥异。

因为我和司机同属于一个类别——人类,而车是属于另一种类别。于是引出面向对象的两个核心概念——类与对象。

对象:

书面定义是:一种建模方法,即表示客观世界问题空间中的某个具体事务,又表示软件空间中的基本元素,由属性和方法构成。

说人话就是:大类别的具体个体,是具体的一辆车、具体的一个人。

类:

对于具有共同具体属性的对象的描述。类是对象的蓝图,是对象的模具。

类,如学生类:

    学号 姓名 性别

对象,如小明同学:

    学号:001 姓名:小明 性别:男

3.如何寻找类和对象

3.1.概述

在实际开发中,如何从业务场景中抽象出类和对象,并将其表示出来,这无疑是面向对象编程中的关键点,一般分为几个步骤:

  1. 从场景描述中识别候选类
  2. 筛选候选类,确定概念类
  3. 识别关联
  4. 识别重要属性

在这几个步骤中识别候选类、确定概念类是最重要的,要先从场景中识别出类来,才谈得上后面的表示,识别类有常用的几个方法:

  1. 名词分析法
  2. 行为分析法
  3. CRC法

这里重点介绍一下名字分析法,这是最常用的一种识别方法。

3.2.示例

1.业务场景:

1.收银员开始一次新的销售

2.如果是VIP客户,收银员输入VIP客户编号

3.收银员录入商品标识

4.系统记录商品;并显示商品和赠品信息(如果有商品赠送策略的话);商品信息包括商品标识、描述、数量、价格、特价(如果有商品特价策略的话)和本项商品总价;赠品信息包括标识、描述与数量。

5.系统显示已购入的商品清单和赠品清单;商品清单包括商品标识、描述、数量、价格、特价、各项商品总价和所有商品总价;赠品清单包括商品标识、描述和数量。

收银员重复3-5步;直到完成所有商品的输入。

6.收银员结束输入;系统计算并显示总价;计算根据总额特价策略进行。

7.系统根据总额赠送策略补充商品清单。

8.收银员请顾客支付账单。

9.顾客支付;收银员输入收取的现金数额。

10.系统给出应找的余额;收银员找零。

11.系统记录销售信息、商品清单、赠送清单和账单信息;并更新库存。

12.系统打印收据。

标黄部分为使用名词分析初步找出的候选类。

如何从初步找打的众多候选类中找出确定有用的,有以下准则:

  1. 依据系统的需求,必须有类去实现对应需求。
  2. 该类的对象实例的状态和行为是否完全必要,是否能构建出一个有状态和行为的类。

2.确定概念类:

候选类向概念类转化的判断技巧:

  1. 如果一个候选类即需要保持一定的状态又需要依据状态表现出一定的行为,那这就必是一个概念类。
  2. 如果一个候选类只需要维护状态,不需要表现行为,那它就是其他类的一个属性。
  3. 如果一个候选类不需要维护状态,却需要表现行为,需要确定有没有关联状态和他有关系,如果发现没有关联状态和他有关系也没有遗漏需求,那么这个类多半可以剔除,将行为转交给其他具备状态支持能力的其他概念类。

3.识别关联:

根据以上场景可以得到如下类关联关系:

4.如何表示类

4.1.什么是UML

使用UML图表示类,UML是一种统一建模语言,由一组符号组成,用来描述软件模型中各个元素之间的关系。

4.1.关系

UML中元素间的不同关系使用不同的连线来表示

4.2.权限

public 公用的 :用+ 前缀表示 ,该属性对所有类可见。

protected 受保护的:用 # 前缀表示,对该类的子孙可见。

private 私有的:用- 前缀表示,只对该类本身可见。

package 包的:用 ~ 前缀表示,只对同一包声明的其他类可见。

4.3.依赖

4.4.泛化(继承)

4.5.实现

实现是继承的特例。

接口:

实现类:

4.6.关联

关联关系,即类与类之间的联系,是依赖关系的特例。

关联关系分为两种,单项一对一、双向一对一。

4.7.聚合

聚合关系是依赖关系的特例,依赖之间可以分开,即被依赖的类和依赖它的类不同生共死,也就是说被依赖的类的实体需要从外界传入。

4.8.组合

组合关系是依赖关系的特例,依赖之间不可以分开,即被依赖的类和依赖它的类同生共死,也就是说被依赖的类的实体就在依赖它的实体内部生老病死,不需要从外界传入。

经验分享 程序员 微信小程序 职场和发展