软件工程5.21
总结摘要
5.21课堂笔记
进程视图
面向系统架构师和开发人员
适用于多进程多视图,关注系统的并发性、分布性、性能和资源分配
形式
- UML类图
进程间的交互
- 进程间的交互可以用时序图表示
单线程的Web服务器
多线程的Web服务器
- 每来一个连接,创建一个线程。从线程池中分配空余的线程
- 多线程协作
- 线程同步
- 进程通信
- 死锁的预防、检测和解除
AWS ELB(弹性负载均衡器)Amazon Web Services提供的负载均衡服务
活动图
- 哪些进程
- 中间件
- 进程间信息的交互
部署图
开发视图
关注
- 模块划分
- 文件组织
- 依赖关系
- 构建过程
分层架构描述
- UML——包图
源代码目录结构
包图
- 按业务逻辑分
- 适合综合性强的团队
- 按功能性需求分
- 依赖其他模块,调试困难
- 按业务逻辑分
构件图
- 关注系统的逻辑结构(物理部署由部署图描述)
- 构件和类
- 相似:
- 不同:类(逻辑),构件(物理)
- UML
- package::component
- ○供给接口
- 半圆是需求接口
- 装配:$–(○$
- 要素
- 构件
- 接口库
- 接口
- 端口
- 关系
图标形式、或interface形式
连接件
- 直连
- 代理连接
- 依赖和实现关系
- 虚线箭头、实现镜头

部署视图
非功能性需求
关注
- 软件节点
- 硬件
- 逼数
- 运行
- 寻访环境
部署时,尽量不要动源代
开发和测试、生产的环境是有不同的
向外开放,浏览请求增多时,并发性差
部署图
- 元素
- 节点
- 工件
- 通信路径
- 元素
场景视图
- “4+1”的“+1”部分
- 用例图、序列图
- 作用
- 验证其他4个视图
- 逻辑视图
- 开发视图
- 进程视图
- 部署视图
- 将其他四个视图整合到一起,展示他们是如何协同工作的
- 和甲方沟通
- 验证其他4个视图
- 使用
- 优先关键场景
- 高频使用场景
- 绘制其交互图
- 检查其他四个视图是否一致,是否满足场景需求
- 调整其他四个视图,保持一致性
- 沟通
视图的选择
- 有所侧重
- Web:逻辑视图、开发视图
- 并发:进程视图、物理视图
- 单击:部署视图(多余)
- 单进程视图:进程视图(多余)
- 额外新添视图
- 技术视图(可以画)
- 技术选型:编程语言、操作系统、数据库、框架、中间件、库
- 数据视图
- ER
- O-R Mapping技术
- 解决对象与数据库模型不匹配问题,实现对象和记录之间的转换
- 核心功能
- 持久化
- 查询
- 关系管理
- 上下文视图
- 顶层的数据流程图
- 行为视图
- 安全视图
- 性能视图
- 运营视图
- 业务视图
- 技术视图(可以画)
非功能性
可用性的策略
- 错误检测
- 方法
- 被动式查错。设置检查点
- 主动式查错。规定时间检错
- 技术
- 命令(双工)
- 心跳(单工)
- 异常
- 方法
- 错误恢复
- 策略
- 备份
- 热。主系统和备份系统同时运作,只有主系统返回结果,丢弃备份系统的结果
- 暖。主系统将结果发送给备份系统用于状态同步,备份系统不进行处理。
- 正在进行未结束的进程无法恢复
- 闲置。周期性地在持久性介质上创建检查点。
- 修复
- 影子修复
- 检查点修复
- 备份
- 策略
- 错误预防
- 研发时
- 运维时
可维护性策略
- 局部化修改
- 防止涟漪效应
- 推迟绑定时间
性能策略
- 资源请求:降低系统处理所有事件时对资源的需求
- 资源管理:提高资源的利用效率
- 并发。相应出现临界资源分配的问题
- 数据库副本。额外考虑一致性
- 增加可用的资源
- 资源仲裁
安全性
- 抵御攻击
- 认证授权
- 数据加密
- 检测攻击
- 在攻击中恢复
可测试性
易用性
课后熟悉UML符号
软件质量
SOLID 面向对象的设计原则
单一职责
- 只有一个是导致变更的原因
- 一个类就是一个职责
开闭原则
- 封装可变点
LSP
- 子类应该替换基类
ISP原则
- 接口隔离
- 接口不能做得过于庞大
DIP依赖倒置
- 高层模块不应该依赖低层模块。即细节在低层,高层不需要考虑低层?低层服务高层
CARP复用
- 尽量用组合聚合复用,不要用继承(继承有很多毛病,继承会破坏封装,会把父类的实现细节暴露给子类,父类变,子类跟着变)
- 缺点:组合和聚合的关系比较复杂
- Coad法则
- 子类能完全替代父类,就是好的继承
- 只有满足
- 子类是超类的特殊种类,has-A 和 is-A 只有 is-A 才符合继承关系
- 子类具有扩展超类的责任,是扩展,不是替换
LoD迪米特法则
- 最少知识原则,一个对象应该只知道与自己直接相连的对象交互,对其他对象不需要知道其内部
总结
- SRP单一职责原则
- OCP开闭原则
- LSP里氏代换原则
- DIP依赖倒置原则
- ISP接口隔离原则
- CARP组合聚类原则
- LoD迪米特法则
设计模式(基础:GoF)
Design Pattern
划分方法一(按目的,划分为三大类)
- 创建型模式
- 关键对象的创建过程
- 工厂方法
- 适用场景:在运行时才确定需要创建的对象类型
- 抽象工厂
- 适用场景:对个相关产品的家族,e.g.UI组件;系统有多余一个的产品族,系统只消费其中某一产品族
- 建造者模式 Builder
- 结构
- 产品
- 抽象建造者:定义构造产品的抽象步骤
- 具体建造者:实现抽象建造者,返回具体的部件并构建返回产品
- 指导者:调用建造者的方法,调整
- 使用:复杂对象,组成部件会变化,但组成的过程不会变化。
- 不要在指导Director里返回产品Product
- 职责分离
- 明确Factory和Director
- 灵活性和封装性
- 可选的Director角色
- 职责分离
- 适用场景:复杂的内部结构,每一个内部结构成分本身可以是对象,也可以是一个对象的组成部分。
- 结构
- 原型模式 Prototype
- 适用场景:大量类似的对象,减少重复初始化的开销
- 关键机制:
- 深拷贝:包含引用(如列表、对象),创建完全独立的新实例,缺点:开销大
- 实现方式
- 手动拷贝
- 序列化
- 第三方库
- 实现方式
- 浅拷贝:简单的结构,对引用类型仍指向源对象(共享),JAVA的Object.clone()属于这一种
- 深拷贝:包含引用(如列表、对象),创建完全独立的新实例,缺点:开销大
- JAVA语言天生支持原型模式
- 原型管理器
- 单例模式
- 饿汉法
- 懒汉法
- 适配器模式
- 在不改变原有实现上,让不兼容接口转变为兼容接口
- 实现方式
- 类适配器
- 对象适配器
- 桥接名词
- 工厂方法
- 关键对象的创建过程
- 结构型模式
- 处理类或对象的组合方式
- 模式列表7种
- …
- 行为性模型
- 关注类和对象之间的交互方式及职责分配
- 模式列表11种
- 创建型模式
划分方法二(按作用域,划分为动静两类)
- 类模式(静态)
- 对象模式(动态)
