11.面向对象设计笔记

面向对象分析-问题域精确模型
面向对象设计-求解问题域模型,得到系统实现方案

面向对象设计六准则

模块化、抽象、信息隐藏、弱耦合、强内聚、可重用

抽象: 过程抽象、数据抽象(规格说明抽象)、参数化抽象
信息隐藏: 类结构分离接口和实现,从而对于类的用户,属性的表示方法和操作的实现算法都是隐藏的。
可重用: 尽量使用已有的类,而且在创建新类时考虑将来的可重用性。

弱耦合

耦合: 不同对象之间相互关联的紧密程度。
两类耦合:交互耦合、继承耦合

交互耦合: 对象之间的耦合通过消息来实现。为了使交互耦合更松散,应该:

  1. 减少消息包含的参数个数和复杂程度
  2. 减少对象发送的消息数。

继承耦合: 一般化类和特殊类之间的耦合。应该提升继承耦合程度。为此:

  1. 派生类应该确实是对其一般化类的具体化。
  2. 特殊类尽可能多使用一般化类的属性和服务。.

结构化范型中的耦合要求,从低到高排序:
数据耦合(尽量使用)
控制耦合、特征耦合(少用)
公共环境耦合(限制其范围)
内容耦合(完全不用)

强内聚

内聚: 衡量一个模块内各个元素彼此结合的紧密程度。三种不同层级的内聚要求:服务内聚、类内聚、一般-特殊内聚。
服务内聚: 一个服务应该仅完成一个功能。(服务层面)
类内聚: 一个类应该只有一个用途。
一般-特殊内聚: 设计出的一般-特殊结构(继承结构)应该符合对应领域知识的概念。一般来说,紧密的继承耦合和高度一般特殊内聚是一致的。

信息化内聚: 面向对象泛型中内聚的最高形式。类中的操作完全以数据为中心,不存在和数据无关的操作。一般满足信息化内聚的模块也满足结构化泛型中的功能内聚

结构化泛型中的内聚要求:
高内聚:功能内聚和顺序内聚
中内聚:通信内聚和过程内聚
低内聚:偶然内聚、逻辑内聚和时间内聚

六个启发规则

  1. 设计结果清晰易懂
  2. 一般-特殊结构的深度适当。中等规模系统(100个左右类)中,类等级层次数保持在7±2
  3. 设计简单的类
  4. 使用简单的协议
  5. 使用简单的服务
  6. 尽量减小设计变动

软件重用(软件成分重用)

代码重用包括:剪贴、包含(include)和继承。
10种可重用的典型成分:项目计划、成本估计、体系结构、需求模型和规格说明、设计结果、源代码、用户文档和技术文档、用户界面、数据、测试用例。总结一下就是没啥不可以重用的。以下主要讨论类构件的重用。

可重用类构件的特点

  1. 模块独立性强、可靠性高。
  2. 高度可塑性–提供简单方便的用以扩充和修改已有构件的机制。
  3. 接口清晰简明可靠,而且有详尽的文档说明。

三种重用方式

实例重用、继承重用、多态重用。

系统分解

五层次:主题、类、结构、属性、服务
OOD模型的四个子系统:问题域子系统、人机交互子系统、任务管理子系统、数据管理子系统

子系统之间的交互方式
客户-供应商关系–客户调用供应商完成任务,后者无需了解前者接口。
平等伙伴关系–每个子系统都可能调用其他子系统。
尽量使用客户-供应商关系。

组织系统的两种方案:
层次组织–垂直分解成若干弱耦合子模块,每个模块提供一种类型服务。
块组织–水平分层,上下层之间往往存在客户-供应商关系。
此两种方案可以任意组合。

拓扑结构–管道装、树状、星状等。

设计问题域子系统

只要可能,就应该保持OOA所建立的问题与结构,因此该过程只是从实现角度对问题域模型进行一些补充和修改。如下:
调整需求
重用已有的类
将问题域类组合在一起
添加一般化类以建立协议:一些具体类需要一个公共的协议,通过定义根类来实现。
调整继承层次:根据所使用语言是否支持多继承来调整继承层次便于实现。
支持多继承:窄菱形模式-容易出现属性和服务的命名冲突、阔菱形模式-冲突可能性较小,但需要更多的类才能完成设计。
支持单继承:将多继承结构,简化为单继承结构,可能需要在各个具体类中重复定义某些属性和服务。

设计人机交互子系统

详细见6.2
过程:分类用户–描述用户–设计迷你高龄层次-设计人机交互类

设计任务管理子系统

以动态模型作为分析并发性的主要依据。分析哪些哪些是必须同时动作的对象,哪些是相互排斥的对象,然后划分任务。用任务(task)实现控制线。
确定事件驱动型任务:睡眠-接收消息激活-完成任务睡眠
确定时钟驱动型任务:每隔一定时间触发处理。
确定优先任务:将特殊优先级(高优先级/低优先级)的服务分离成独立(背景)任务处理
确定关键任务:关系系统成败的关键处理,分离成独立任务
确定协调任务:系统中存在三个以上任务时,加一个协调任务
尽量减少任务数–
确定资源需求–

设计数据管理子系统

系统存储或检索对象的基本设施。

设计数据格式

(依赖于数据存储管理模式,下三种)
文件系统

  1. 定义第一范式表:列出每个类的属性表,规范成第一范式。
  2. 为每个第一范式表定义一个文件
  3. 测量性能和需要的存储容量
  4. 修改原设计的第一范式以满足性能和存储要求

关系型数据库管理系统

  1. 定义第三范式表:列出每个类的属性表,规范成第三范式。
  2. 为每个第一范式表定义一个数据库表
  3. 测量性能和需要的存储容量
  4. 修改原设计的第三范式以满足性能和存储要求

面向对象数据库管理系统,有两种途径:

  1. 扩展的关系数据库途径:同关系数据库
  2. 扩展的面向对象程序设计途径:无需规范化,非关可以直接存储对象。

数据库三范式
1NF:每一列属性都是不可再分的属性值,确保每一列的原子性
2NF:全部属性完全依赖于主键整体,而不是主键的一部分。
3NF:属性和主键有直接关系而不是间接关系(间接关系指,通过其他非主键和主键产生联系)。

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)
三范式的文章
https://zhuanlan.zhihu.com/p/63146817

设计相应的服务

设计对象内部用来保存对象自身的服务,和外部用来通知对象保存自身的服务。

设计类中的服务

设计算法、选择恰当的数据结构,定义内部类和内部操作等。

设计关联

关联的遍历:单向遍历/双向遍历,或称单向/双向关联。
单向:属性中添加指针
实现双向关联有三种方式:

  1. 用属性实现一个方向,反向遍历时执行一次正向查找
  2. 两个方向的遍历都用属性实现
  3. 用独立的关联对象实现

总结一下,就是属性和关联对象两种关联方式。
设计关联对象的方法-取决于关联重数

  1. 一对一关联-可以和参与关联的任一对象合并
  2. 一对多关联-可以和“多”端合并
  3. 多对多关联-独立的关联类

设计优化

确定优先级(各种质量指标的优先级)
提高效率的几项技术:增加冗余关联、调整查询次序、保留派生属性。
调整继承关系/委托关系。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值