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

文章目录

  • 面向对象设计六准则
    • 弱耦合
    • 强内聚
  • 六个启发规则
  • 软件重用(软件成分重用)
    • 可重用类构件的特点
    • 三种重用方式
  • 系统分解
  • 设计问题域子系统
  • 设计人机交互子系统
  • 设计任务管理子系统
  • 设计数据管理子系统
    • 设计数据格式
    • 设计相应的服务
  • 设计类中的服务
  • 设计关联
  • 设计优化

面向对象设计六准则

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

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

弱耦合

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

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

  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. 多对多关联-独立的关联类

设计优化

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

11.面向对象设计笔记相关推荐

  1. 《设计模式:可复用面向对象软件的基础》——面向对象设计原则、创建型模式(笔记)

    文章目录 二.面向对象设计原则(补充) 2.1 重新认识面向对象 2.2 面向对象设计原则 2.2.1 依赖倒置原则(DIP) 2.2.2 开放封闭原则(OCP) 2.2.3 单一职责原则(SRP) ...

  2. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  3. python笔记11面向对象

    python笔记11面向对象思想 先声明一下 各位大佬,这是我的笔记. 如有错误,恳请指正. 另外,感谢您的观看,谢谢啦! 面向对象 :将数据与函数绑定在一起,进行封装,减少重复代码的重写过程 面向过 ...

  4. 面向对象设计原则 (快速记忆11个原则)

    (1)单一责任原则(Single Responsily Pinciple, SRP). 就个类而言, 应该仅有个引起它变化的原因.即,当需要修改某个类的时候原因有且只有一个,让一个类只做种类型责任. ...

  5. 面向对象设计的11项原则

    主要5大原则 (1)单一责任原则.就一个类而言,应该仅有一个引起它变化的原因.即,当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任. (2)开放一封闭原则.软件实体(类.模块.函数等) ...

  6. 笔记整理-信息系统开发基础-面向对象分析与设计-面向对象设计的基本任务

    面向对象设计的基本任务,把面向对象分析模型转化为面向对象的设计模型,具体包括以下任务:设计人员必须完成以下任务:设计用例实现方案.设计技术支撑设施.设计用户界面.精化设计模型. 面向对象的分析模型主要 ...

  7. php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程

    面向对象设计是php程序开发中一个很重要的内容块,如果你想成为高级php程序员我们必须知道面向对象设计具体用法与写法. 维护简单 模块化是面向对象编程中的一个特征.实体被表示为类和同一名字空间中具有相 ...

  8. 深入PHP面向对象、模式与实践读书笔记:面向对象设计和过程式编程

    注:本文内容来<<深入PHP面向对象.模式与实践>>中6.2节. 6.2 面向对象设计与过程式编程   面向对象设计和过程式编程有什么不同呢?可能有些人认为最大的不同在于面向对 ...

  9. 7.11 其他面向对象设计原则2:能用组合的地方,不要用继承

    其他面向对象设计原则2  能用组合的地方,不要用继承 Favor object composition over class inheritance 6.1 代码重用的两种方式  能用组合的地方不 ...

最新文章

  1. 解决Inno Setup制作安装包无法创建桌面快捷方式的问题
  2. Android CameraSurfaceView在SurfaceView上实现拍照,视频录像
  3. 判断一个变量是不是数组
  4. 实用正则表达式(实用篇)
  5. Windows常用命令行命令
  6. 【Android】Apk安装和删除
  7. udf、utaf、udtf进出数量规律
  8. 运行时库例程-acc_get_num_devices
  9. mySQL 数据库错误
  10. MySQL 事物隔离级别
  11. 前端学习(3236):react生命周期3
  12. 中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...
  13. 使用switch case语句来显示月份的对应天数
  14. 代码控制树视图 c# 1614262980
  15. JSK-23223 数字反转【进制】
  16. IE7 下载EXCEL注意地方
  17. python桌面程序臃肿_为Python应用构建最精简Docker
  18. H53D旋转-遁地龙卷风
  19. redis缓存数据库技术
  20. 测试思维:正向思维和逆向思维

热门文章

  1. 安卓模拟器安装教程_安卓终端模拟器-安卓命令行入门教程系列(新手的福利)
  2. Windows 蓝屏代码大全,Bug检查代码参考
  3. 抖音旅游号视频文案技巧
  4. RCode对比RStudio使用体验
  5. UESTC--ICODING数组与广义表-----矩阵加法
  6. ASP动态网站建设之连接数据库相关操作
  7. Ubuntu 安装nginx
  8. township android,township无限绿钞最新版-township无限绿钞安卓版下载-西西安卓游戏...
  9. Android 获取音频MP3文件的专辑缩略图
  10. linux系统ata1.00,Linux : ata: failed command: READ FPDMA QUEUED