面对对象设计OOD

学习

   阅读量:  

任务

设计则是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程

面向对象设计的准则与启发规则

准则

  • 模块化
    • 模块化就是把程序划分成独立 命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求
  • 抽象化(Abstraction)
    • 软件工程过程的每一步都是对软件解法的抽象层次的一次精化
  • 信息隐藏与局部化
    • 使一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的
  • 弱耦合
    • 一个软件结构内不同模块之间互连的紧密程度
  • 强内聚
    • 内聚衡量一个模块内各个元素彼此结合的紧密程度
  • 可重用

SOLID原则

d21371212577f6f2c53adb7530281ccc.png

单一职责原则(Single Responsibility Principle)

一个类只允许有一个职责,即只有一个导致该类变更的原因

开闭原则(Open Close Principle)

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭 d647fb27657aae257758cdbce126c47c.png

里氏替换原则(Liskov Substitution Principle)

  • 所有引用基类的地方必须能透明地使用其子类的对象,也就是说子类对象可以替换其父类对象,而程序执行效果不变
  • 在继承体系中,子类中可以增加自己特有的方法,也可以实现父类的抽象方法,但是不能重写父类的非抽象方法,否则该继承关系就不是一个正确的继承关系

迪米特法则(Law of Demeter)

  • 一个对象应该对尽可能少的对象有接触,也就是只接触那些真正需要接触的对象
  • 可以良好地降低类与类之间的耦合,减少类与类之间的关联程度,让类与类之间的协作更加直接

接口分离原则(Interface Segregation Principle)

  • 多个特定的客户端接口要好于一个通用性的总接口

依赖倒置原则(Dependency Inversion Principle)

引入中间抽象层

  • 依赖抽象,而不是依赖实现。
  • 抽象不应该依赖细节;细节应该依赖抽象。
  • 高层模块不能依赖低层模块,二者都应该依赖抽象 32d8597edae2b2595388b78d1fe5ba7f.png

https://juejin.cn/post/6844903673672237063

包的设计原则

内聚性原则

  • 重用发布等价原则(REP)
  • 共同重用原则(CRP)
    • 趋向于共同重用的类应该属于同一个包
    • 如果依赖于一个包,那么应该依赖于该包中的所有类
    • 相互之间没有紧密联系的类不应该在同一包内
  • 共同封闭原则(CCP)
    • 包中的所有类对于同一类性质的变化应该是共同封闭的。即一个变化若对一个包产生影响,则将对包中的所有类产生影响,而对于其他的包不会造成任何影响
    • 一个包不应该包含多个引起变化的原因

耦合性原则

  • 无环依赖原则(ADP)
  • 稳定依赖原则(SDP)
    • 朝着稳定的方向进行依赖
  • 稳定抽象原则(SAP)
    • 包的抽象程度应该和其稳定程度一致
  • SAP+SDP构成了包的DIP原则。依赖应该朝着稳定的方向进行+稳定性意味着抽象性=>依赖应该朝着抽象的方向进行

https://blog.csdn.net/wangshou84/article/details/100601774

启发规则:简单

  1. 设计结果应该清晰易懂

  2. 一般-特殊结构的深度应适当

    1. 一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为7±2
  3. 设计简单的类

  4. 使用简单的协议

  5. 使用简单的服务

  6. 把设计变动减至最小

软件重用

重用指同一事物不作修改或稍加改动就多次重复使用

软件成分重用

  • 代码重用
  • 设计结果重用
  • 分析结果重用

类构件的重用方式

  • 实例重用

    • 使用适当的构造函数,按照需要创建类的实例
  • 继承重用

    • 继承性提供了一种对已有的类构件进行复用的机制
  • 多态重用

    • 使对象的对外接口更加一般化,降低了消息连接的复杂程度

系统分解

  • 层次组织
  • 块状组织

image-20221225201140461

  • 设计人机交互子系统
  • 设计问题域子系统
  • 设计任务管理子系统
    • 研究并发性
    • (1) 确定事件驱动型任务 (2) 确定时钟驱动型任务 (3) 确定优先任务 (4) 确定关键任务 (5) 确定协调任务 (6) 尽量减少任务数 (7) 确定资源需求
  • 设计数据管理子系统
    • 文件管理系统
    • 关系数据库管理系统
    • 面向对象数据库管理系统
      • 扩展的关系数据库管理系统
      • 扩展的面向对象程序设计语言

设计类中的服务

  • 确定类中应有的服务
  • 设计实现服务的方法
    • 设计实现服务的算法

      • (1) 算法复杂度。
      • (2) 容易理解与容易实现。
      • (3) 易修改。
    • 选择数据结构

    • 算法与数据结构的关系

    • 定义内部类和内部操作

设计关联

  • 关联的遍历

  • 单向关联:指针

  • 双向关联

    • 只用属性实现一个方向的关联:反向遍历

    • 两个方向的关联都用属性实现:快速,复杂

      • image-20221225203442942
    • 用独立的关联对象实现双向关联:复杂

  • 关联对象的实现

    • 一对一
    • 一对多
    • 多对多

可以引入一个关联类来保存描述关联性质的信息,关联中的每个连接对应着关联类的一个对象。

☆设计优化

确定优先级

提高访问效率的几项技术

  1. 增加冗余关联以提高访问效率
    1. 索引
    2. HASH表
  2. 调整查询次序
  3. 保留派生属性

调整继承关系

  1. 抽象与具体
    1. 先创建一些具体类;
    2. 归纳出抽象类;
    3. 进一步具体化;
    4. 再次归纳
  2. 为提高继承程度而修改类定义
  3. 利用委托实现行为共享

把一类对象作为另一类对象的属性,从而在两类对象间建立组合关系

image-20221225202145667
Licensed under CC BY-NC-SA 4.0
最后更新于 Dec 28, 2022 23:33 +0800