任务
设计则是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程
面向对象设计的准则与启发规则
准则
- 模块化
- 模块化就是把程序划分成独立 命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求
- 抽象化(Abstraction)
- 软件工程过程的每一步都是对软件解法的抽象层次的一次精化
- 信息隐藏与局部化
- 使一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的
- 弱耦合
- 一个软件结构内不同模块之间互连的紧密程度
- 强内聚
- 内聚衡量一个模块内各个元素彼此结合的紧密程度
- 可重用
SOLID原则
单一职责原则(Single Responsibility Principle)
一个类只允许有一个职责,即只有一个导致该类变更的原因
开闭原则(Open Close Principle)
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
里氏替换原则(Liskov Substitution Principle)
- 所有引用基类的地方必须能透明地使用其子类的对象,也就是说子类对象可以替换其父类对象,而程序执行效果不变
- 在继承体系中,子类中可以增加自己特有的方法,也可以实现父类的抽象方法,但是不能重写父类的非抽象方法,否则该继承关系就不是一个正确的继承关系
迪米特法则(Law of Demeter)
- 一个对象应该对尽可能少的对象有接触,也就是只接触那些真正需要接触的对象
- 可以良好地降低类与类之间的耦合,减少类与类之间的关联程度,让类与类之间的协作更加直接
接口分离原则(Interface Segregation Principle)
- 多个特定的客户端接口要好于一个通用性的总接口
依赖倒置原则(Dependency Inversion Principle)
引入中间抽象层
- 依赖抽象,而不是依赖实现。
- 抽象不应该依赖细节;细节应该依赖抽象。
- 高层模块不能依赖低层模块,二者都应该依赖抽象
https://juejin.cn/post/6844903673672237063
包的设计原则
内聚性原则
- 重用发布等价原则(REP)
- 共同重用原则(CRP)
- 趋向于共同重用的类应该属于同一个包
- 如果依赖于一个包,那么应该依赖于该包中的所有类
- 相互之间没有紧密联系的类不应该在同一包内
- 共同封闭原则(CCP)
- 包中的所有类对于同一类性质的变化应该是共同封闭的。即一个变化若对一个包产生影响,则将对包中的所有类产生影响,而对于其他的包不会造成任何影响
- 一个包不应该包含多个引起变化的原因
耦合性原则
- 无环依赖原则(ADP)
- 稳定依赖原则(SDP)
- 朝着稳定的方向进行依赖
- 稳定抽象原则(SAP)
- 包的抽象程度应该和其稳定程度一致
- SAP+SDP构成了包的DIP原则。依赖应该朝着稳定的方向进行+稳定性意味着抽象性=>依赖应该朝着抽象的方向进行
https://blog.csdn.net/wangshou84/article/details/100601774
启发规则:简单
-
设计结果应该清晰易懂
-
一般-特殊结构的深度应适当
- 一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为7±2
-
设计简单的类
-
使用简单的协议
-
使用简单的服务
-
把设计变动减至最小
软件重用
重用指同一事物不作修改或稍加改动就多次重复使用
软件成分重用
- 代码重用
- 设计结果重用
- 分析结果重用
类构件的重用方式
-
实例重用
- 使用适当的构造函数,按照需要创建类的实例
-
继承重用
- 继承性提供了一种对已有的类构件进行复用的机制
-
多态重用
- 使对象的对外接口更加一般化,降低了消息连接的复杂程度
系统分解
- 层次组织
- 块状组织
- 设计人机交互子系统
- 设计问题域子系统
- 设计任务管理子系统
- 研究并发性
- (1) 确定事件驱动型任务 (2) 确定时钟驱动型任务 (3) 确定优先任务 (4) 确定关键任务 (5) 确定协调任务 (6) 尽量减少任务数 (7) 确定资源需求
- 设计数据管理子系统
- 文件管理系统
- 关系数据库管理系统
- 面向对象数据库管理系统
- 扩展的关系数据库管理系统
- 扩展的面向对象程序设计语言
设计类中的服务
- 确定类中应有的服务
- 设计实现服务的方法
-
设计实现服务的算法
- (1) 算法复杂度。
- (2) 容易理解与容易实现。
- (3) 易修改。
-
选择数据结构
-
算法与数据结构的关系
-
定义内部类和内部操作
-
设计关联
-
关联的遍历
-
单向关联:指针
-
双向关联
-
只用属性实现一个方向的关联:反向遍历
-
两个方向的关联都用属性实现:快速,复杂
-
用独立的关联对象实现双向关联:复杂
-
-
关联对象的实现
- 一对一
- 一对多
- 多对多
可以引入一个关联类来保存描述关联性质的信息,关联中的每个连接对应着关联类的一个对象。
☆设计优化
确定优先级
提高访问效率的几项技术
- 增加冗余关联以提高访问效率
- 索引
- HASH表
- 调整查询次序
- 保留派生属性
调整继承关系
- 抽象与具体
- 先创建一些具体类;
- 归纳出抽象类;
- 进一步具体化;
- 再次归纳
- 为提高继承程度而修改类定义
- 利用委托实现行为共享
把一类对象作为另一类对象的属性,从而在两类对象间建立组合关系