软件设计与重构
**# 软件开发
“Talk is cheap ,show me the code” 。
软件建模
软件建模是在需求和实现之间架起了桥梁。
如何进行软件建模
-
软件建模原则:不同视角
- 外部视角:对系统上下文或者环境进行建模
- 交互视角:对系统及其环境部或者系统的构件之间的交互建模
- 结构化视角:对系统的组织或者系统所处理的数据的结构进行建模
- 行为视角:对系统的动态行为以及系统如何响应事件进行建模
-
软件建模方法:
- 面向对象方法建模
-
软件建模工具:
- UML
UML内容组成:包括事物,关系,图
事物:是UML中重要的组成部分,最静态的部分,代表概念或者物理上的元素。
关系:指的是事物的关系 关联 依赖 泛化 实现
图:指的是事物相互相关
UML 模型在软件开发流程中,不同阶段需要用到不同的UML图
软件开发流程:
timelinetitle 软件开发流程需求分析 : 用例图概要设计 : 类图、对象图、合作图、状态图、顺序图、活动图详细设计 : 类图、对象图、合作图、状态图、顺序图、活动图编码阶段 : \测试 : 类图、组件图、部署图
类图:
- 实现:类和接口的关系 类是接口所有特征和行为的实现 虚线三角箭头
- 依赖:类似于资源依赖,是后者需要使用前者 虚线箭头
- 泛化: 继承关系 实线三角箭头
- 关联: 拥有的关系 一个类知道另一类的属性和方法
- 聚合: 整体和个体的关系 菱形箭头实线
- 组合: 整体和局部
三角箭头:
实线: 泛化 继承的关系
虚线: 实现 接口和类的关系
菱形:
实线: 组合 整体和局部 车 和 车胎 车灯
虚线: 聚合 整体和个体 蚁群和蚂蚁
箭头:
实线: 关联 拥有 一个类知道另一个类的属性和方法
虚线: 依赖
9种UML图:
- 用例图 use-case图 ,描述角色以及角色与用例之间的连接关系:泛化、关联、依赖 谁使用系统 以及使用系统做什么? 关联: 角色直接参与用例的执行 泛化: 角色或者用例之间的继承关系 依赖:
- 类图 : 用于描述系统中的类 以及各种关系 泛化 实现 依赖 关联 聚合 组合
- 对象图 : 表示的类的实例 对象之间的关系
- 状态图 : 用于描述类的对象所有可能的状态,以及事件发生时状态转移条件 对类图行为上的补充
- 活动图 : 用于描述用例要求所要进行的活动,以及活动之间的约束关系
- 顺序图 : 描述参与者与系统对象之间有序的交互过程 。强调消息是如何在对象之间被发送和接收的。
- 合作图 : 用于描述对象之间的相互通信关系。
- 组件图 : 描述代码构件的物理结构以及各种构件之间的依赖关系。
- 部署图 : 描述系统的物理部署 。
动态图: 顺序图 活动图 状态图
设计原则和设计模式
正交四原则:
- 最小化变化:重复意味着代码耦合,当重复代码需要修改,容易出现漏改的问题
- 分离变化:识别变化方向并对变化预留扩展接口
- 缩小依赖范围: 最小化知识原则:依赖接口,不要依赖实现
- 向稳定方向依赖: 定义API要关注接口,而不关注实现。接口是稳定的,而实现是不同的
SOLID原则:
- 单一职责:一个类,引起它变化的原因只有一个
- 开闭原则: 对扩展开放,对修改关闭。
- 里氏替换:基类设定一系列规范和契约,子类需要遵守
- 依赖倒置原则:接口为稳定的契约 依赖稳定接口
- 接口分离原则 : 客户只需要了解必须了解的。 最小知识原则
23种设计模式:
- 创建型:
- 工厂方法:隔离创建对象的细节 ,使得创建对象的行为可扩展
- 抽象工厂:抽象出创建一组相关对象的接口
- 建造者:包含对象构造的若干过程,因此和tmplate 结合
- 原型: 基于某个对象为模板创建新的对象:PPT中的母版和普通页
- 单例 :
- 结构型:
- 适配器: 空方法实现接口作为抽象父类
- 桥接:使用关联代替继承,解决类多维度的扩展导致的 类爆炸问题
- 组合:将组件组装为整体使用
- 装饰:常用于在原函数执行前后做一些额外的工作
- 外观: 利用树状结构减少调用者的复杂度
- 享元: 复用变化少的对象
- 代理: 是原对象的一个完整的替代品
- 行为型:
- 解释器:一般用于解释执行自定义的某种语法
- 模板方法: 框架与钩子
- 责任链:一组对象按照既定的顺序关联起来,依次处理请求,其中任一对象都可以停止调用传递。
- 命令 : 将行为抽象和解耦
- 迭代器 : 封装数据的访问行为 顺序和可见性
- 中介者 : 用一个中介对象来封装一系列的交互,新增一个模块处理两个模块的交互
- 备忘录 : 将当前对象的状态信息保存为另一个对象,使得对象可以基于状态镜像快速恢复原状态
- 观察者 :observer 订阅/发布模型,用于事件驱动的设计
- 状态 :
- 策略 : 使用接口即使使用strategy ,用于隔离变化
- 访问者 : 数据和行为分离方法 通过这种分离,可达到一个被访问者动态刷新新的操作而无需做其他的修改的效果
创建型: 提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用new运算符直接实例化对象。这让程序在创建对象时更加灵活。要把对象的创建和对象的使用分离。
结构型: 设计模式关注类和对象的组合。继承的概念被用来组合接口和定义对象获得新功能的方式。
行为型: 对象之间的通信。
安全模式
STRIDE
S : Spoofing 假冒 身份认证
T : Tampering 篡改 威胁/数据完整性 防止数据在存储中被篡改
R : Repudiation 抵赖 不可否认性 审计日志设计 确保用户关键行为记录,无法否认其行为
I : information Disclosure 信息泄露 机密性
D : Denial of service 拒绝服务 系统可用性 如何设计软件抵御资源耗尽攻击 性能问题
E : Elevation of privilege 权限提升 最小权限原则