- 复杂系统
- 控制软件复杂性的基本方法
- 面向对象
- UML
- 类模型(描述内部对象及其关系)
- 状态模型(随时间发生变化)
- 交互模型(对象协作完成任务)
- 软件系统分析
- 软件系统设计
复杂系统
具有层次形式
对于基本组件的选择在很大程度上依赖于系统观察者的判断
组件内部之间的联系比组件之间的联系更强
通常由几个不同种类的子系统通过各种排列组合而成
能够从简单系统演化而来
控制软件复杂性的基本方法
分解(把大问题化解成小问题)
通用策略(大问题化小)
面向对象策略(拆分为各个组成部分)
抽象(抽取基本特性,忽略其他)
类型抽象
服务激活抽象(函数调用、、时间处理、信息传递、订阅)
进程控制抽象(单程序执行、多任务、顺序执行、多线程)
关系抽象(关联、聚合)
行为(静态行为、动态行为)
规则(控制规则、业务规则、异常处理规则、竞争规则、触发器)
模块化(高内聚、低耦合)
信息隐蔽(封装,只需要知道模块功能而不需要了解内部细节)
面向对象
面向对象=对象+类+继承通信
适应性、可靠性
特性
标识、分类、继承、多态
开发模式
瀑布模型(不推荐)
迭代模式
UML
视图分类(4+1)
用例视图、逻辑视图、实现视图、进程视图、部署试图
类模型(描述内部对象及其关系)
对象(拥有唯一标识)
类(拥有相同属性、行为、关系的一组对象)
类是对“对象”的抽象
类图
命名(要唯一):英文首字母要大写、中文也可。
值和属性
属性可见性
public(+)
private(-)
protected(#)
package(~)
操作&方法
链接(对象之间的连接,关联的实例)
关联(类之间的联系)
关联可以是一对一、一对多、可能是多对多
具体描述:
1:1个
0…1:0个或1个
0…*:0个或多个
自关联(与自身关联,但关联两端的角色不同)
限定关联(带有限定符,降低多重性关联)
N元关联(无法用编程语言和建模工具表示,需要提升为类)
聚合(强类型,由多个部件构成)
具有传递性(A是B一部分,B是C一部分,则A是C一部分)
组合(整体与部分有相同生存期)
泛化(is-a-kind-of,父类与子类之间的关系)
子类的对象可以被用在父类的对象可能出现的任何地方,反之则不然
支持多态、可结构化描述、支持代码复用
继承
里氏代换原则(判断继承存在)
任何基类出现的地方都可以被其子类替换
如果父类所有行为都可以替换,那继承关系成立,反之则不能。
多重继承(允许多个父类、尽量避免)
java不允许多重继承,但可以通过接口实现类似功能
继承最重要的类、委派其他的类
只保留最重要的继承关系,把其余的继承关系变为组合关系
枚举(有限取值的集合)
属性的枚举即其多重性。
抽象类
用斜体字标识抽象类与抽象方法
状态模型(随时间发生变化)
包含多个状态图,每个类对应一个状态图
状态
所有对象都有状态
状态时对象执行了一系列活动的结果
某事件发生后,对象的状态将发生变化
迁移(从一个状态到另一个状态的瞬时变化)
迁移的源和目标可以是相同的,也可以是不同的。
可以通过事件触发,或是内部活动自动触发
组成部分
源状态
事件触发器
警戒条件(迁移条件的布尔表达式,用**[]括起来)
效应(迁移激活时执行的行为**)
目标状态
描述格式
事件特征标记[警戒条件]/动作
e g : t a r g e t A t ( p ) [ i s T h r e a t ] / t . a d d T a r g e t ( p ) eg:targetAt(p)[isThreat]/t.addTarget(p) eg:targetAt(p)[isThreat]/t.addTarget(p)
事件
外部事件(系统与其参与者之间传送的事件)
eg:操作者按下开关按钮
内部事件(在系统内部对象之间传送的事件)
eg:缓冲区溢出
调用事件(对操作调用,类似函数)
事件名(事件参数表,用逗号隔开)
信号事件(发送或接受信号的事件)
信号(一个对象到另一个对象的单向信息流动)
是对象之间的消息
由一个对象异步发送,并由另一个对象接收的已命名对象
版型(用<<>>表示,是UML基础元素的扩展)
用例版型:如“业务用例”,“业务用例实现”
类版型:如“信号类”,“接口”