面向对象分析和设计(第3版)读书笔记 - 认识 OO

面向对象分析和设计(第3版)读书笔记 - 认识 OO

OO 并不只是 OOP

面向对象就是面向对象编程,只是编程中使用的方法。

面向对象的方法不仅用于编码阶段(软件工程的实现阶段),还用于软件工程的其他阶段(比如,统一软件过程的需求分析和设计阶段)。需求分析阶段使用OOA(面向对象的分析)来从问题域(软件要解决的问题及其背景)中发现类;设计阶段利用从OOA得到的问题抽象通过对机制(机制即模式)的设计(设计即选择)获取符合要求的解决方案;最后在编码阶段编码实现设计中的类的细节。

设计永远是困难的,OO仅是减少了”痛苦”

用了OO,就能应对所有的需求变化,再也不用烦恼

实际上,正如所有复杂问题的解决一样,软件设计的过程也存在大量的不确定性、疑惑、烦恼。使用OO仅仅减轻了这种烦恼,但是始终没有办法摆脱设计过程中感受到的各种疑问。“我究竟要设计成什么样的?我应该具体做些什么才能确定设计?”因为在设计结果出现之前,你更本不知道设计是什么样的。而对设计方法的使用有是十分“随机”和“个性”的。

面向对象分析和设计(第3版)读书笔记 - 认识 OO_第1张图片

设计过程

“设计行为,不论是细微的还是庞大而复杂的,都完全是设计者当时在头脑中的模式记忆以及将这些模式组合成一个新设计的能力所决定的。” —— Alexandar

OO 的基本问题是确定类和对象

在OOA阶段,要从问题域中发现类。发现的过程就是分类的过程。而每个人具有不同的认知,有不同的分类倾向,最终得到的分类就完全不同。即时是同一个人,在给定不同的目的的情况下,其分类也是不同的。

“如何进行分类取决于你想利用分类做什么。” —— Martin

分析和设计是迭代的、增量形式产生的

马上就开始分析和设计,即便使用的方法并不成熟,但是经过不断的探索,在这个过程中不断的试错,不断的获取更多的背景信息,对业务的理解更加深刻。你就可以提出更好的想法,改善之前的设计。就是通过这种不断的迭代,优秀的设计便可能产生。

“单个抽象的形成常常遵循某个常见的模式。首先,问题以一种随意的方式得到解决。随着经验的积累,人们发现某种解决方式比另一写解决方式效果更好,一些好方法在人们之间扣扣相传。最后,有用的解决方案得到了更系统的理解,人们对他们进行编码和分析。” —— Shaw

OOA 理论和方法

OOA 的目的就是从问题域中找到类,OOD 可能需要创造性的发明一些类,设计一些机制(采用一些模式)。OOD 是关于模式的应用的,可以参考“设计模式”类的书籍。注意,OOA的过程仅仅是描述问题域,并不给出解决方案。这里给出一般的“面向对象分析方法”

面向对象的分析的核心问题就是分类(分组)

分类理论

  1. 经典分类:“具有同一属性或同一组属性的实体构成一个分类”
  2. 概念聚集(不太明白)
  3. 原型理论(不太明白)

较为具体的寻找类的方法

  1. 经典方法
  2. 行为分析
  3. 领域分析
  4. 用例分析
  5. CRC卡
  6. 非正式英语描述
  7. 结构化分析

结合作者谈到的几种方法,我认为综合运用这几种方法比较合适。

首先使用用例分析,确定软件的基本场景(?),然后对每个场景进行故事板描述,然后通过分析确定参与该场景的对象、每个对象的责任以及该对象和其他对象的协作(即每个对象对其他对象的调用)。过程中可以使用CRC卡片的来进行记录。对于类的发现可以通过经典方法提供的类来源(实体、事件、交互、角色)来寻找,也可以通过行为分析提供的从具体的具有相同行为的对象抽象出类的方法,还可以利用非正式英语描述中给出的名词实体和数据、动词行为的方法来寻找。

面向对象分析和设计(第3版)读书笔记 - 认识 OO_第2张图片

CRC 卡片,Class-Responsibility-Collabration 类职责协作图
标识类名、类的职责(对外提供的服务)和类与其他类的协作
可以按数据流的方向动态排列,标示信息流;可以按继承关系排列,标示层级结构。

OOD 的核心是机制

关键抽象(类)和机制公共构成了一套设计方案。关键抽象中的一部分来自OOA发现而来的类,另一部分来自机制的设计(选用)使用到的类。类的设计定义了单个对象如何行为,机制则定义了一组对象的协作方式。

关键抽象反映了问题域的抽象,而机制才是设计的灵魂。

机制是一种模式,是一种解决方案。最底层的机制是惯用法,最高层的机制是框架。框架通过提供一种机制来提供一种设计,一种解决方案。

在确定关键抽象后,还需要对关键抽象进行精化,考量的标准就是书中第三章中定的标准。
如果不满足标准,则要对关键抽象重新考量和定义。

抽象的操作
1. 发现 “抽象不足”时,需要使用“类提升”。将比较通用的部分上移,增加共享程度。
2. 发现“抽象过度”时(出现“粒度规模冲突”,类的提升太大,太一般化了,导致很难派生出子类,语义差异过大),需要(?)

流程

  1. 发现类(OOA)
  2. 考察类(检验和操作)(OOA)
  3. 选用机制(OOD)

阅读OO代码请关注对象

之前将整个程序看做一个整体(潜意识认知), 阅读过程中关注的是算法和流程

对于 OO 程序,关注点应该是类和对象。可以按照设计时的角度,按照用例来阅读。分析静态和动态的关系和结构。

模糊的概念

1. 什么是面向对象的分析、设计和编程?

书中给出了定义:

OOA 是一种分析方法,这种方法利用从问题域的词汇表中找到类和对象类分析需求。
OOD 是一种设计方法,包括面向对象的分解过程和一种表示法,这种表示法用于展示被设计系统的逻辑模型和物理模型、静态模式和动态模型。
OOP 是一种实现方法,这种方法中,程序被组织成许多相互协作的对象,每个对象代表某一个类的实例,而类则属于一个通过继承关系形成的层次结构。

2. 怎么样才算是OOP?

必须同时满足以下三点,才能说是进行了OOP(使用了面向对象的编程方法)

  1. 程序的基本逻辑构建块是对象
  2. 每个对象都是类的一个实例
  3. 类与类之间通过继承关联在一起

3. 分析时,是现有对象还是现有类?

“当在一个类型层次中设计类时,并非总是从超类开始,然后创建子类。通常,会先创建一些不相似的类型,之后意识到它们是相关的,然后将它们的共同点分离出来,放到一个或多个超类中… 通常这样上上下下做几次才能获得一个完整和正确的设计。”—— O’Brain

你可能感兴趣的:(读书笔记,面向对象)