概论
软件的基本特征:
- 复杂性、一致性、可变性、不可见性。
软件开发的目标:
- 以用户需求为向导,构建出满足用户需求的软件系统。
软件开发的利益相关者:
- 客户、开发者。
CMM过程成熟度级别:
- 初始级、可重复级、已定义级、已管理级、优化级。
ISO9000标准:
- 主要前提:如果过程是正确的,则结果(产品或服务)就是正确的。
- 组织必须文档化并记录它的所有正式活动。
三级管理系统:
决策级别 | 决策焦点 | 典型IS应用 | 典型IT解决方案 | 关键概念 |
---|---|---|---|---|
策略级 | 长期目标 | 市场和销售分析、产品规划、性能评估 | 数据挖掘、知识管理 | 知识 |
战术级 | 短期目标和资源分配 | 预算分析、薪酬预测、库存调度、客户服务 | 数据仓库、分析处理、电子表格 | 信息 |
操作级 | 员工日常生活和生产支持 | 发薪、发货、采购、财务 | 数据库、事务处理、应用生成器 | 数据 |
系统整体规划及分析方法:
- SWOT:优势(Strengths)、劣势(Weaknesses)、机会(Opportunities)、威胁(Threats)
- VCM:价值链模型(Value Chain Model)
5类基本活动:内部物流、操作、外部物流、销售与市场、服务。 - BPR:业务过程重组(Business Process Reengineering)
方法:确定业务愿景、确定再造过程、度量现有过程、识别IT杠杆、设计原形。 - ISA:信息系统体系结构(Information Systems Architecture)
五个IS参与者:规划者、所有者、设计者、建造者、承包者。
需求确定
需求:定义了系统的期望服务和系统必须遵守的约束。
- 期望服务(功能性需求):系统范围、必须的业务功能、要求的数据结构。
- 系统约束(非功能性需求):可用性、可复用性、可靠性、性能、效率、可支持性。
如何做软件系统的需求分析:
- 需求采集(确定)、需求建模(可视化)、需求规格说明。
需求引导:
- 传统方法:与客户面谈、调查表、观察、研究业务文档。
- 现代方法:软件原型法、头脑风暴、联合应用开发JAD、快速应用开发RAD。
需求协商与确认:
- 需求协商:以文档草稿为基础,对列出的需求进行协商与修正。
- 需求确认:更加完整的需求文档版本,需求标识与分类,利益相关者阅读文档并复审。
- 步骤:需求依赖矩阵、需求风险分析、优先级。
需求管理:
- 标识与分类:唯一标识符、在文档层次内的顺序编号、在需求分类中的顺序编号。
- 变更管理:建立变更请求文档、评估变更影响、实现变更、配置管理工具存储与跟踪。
需求文档:
- 运行环境要求、功能性需求、非功能性需求、接口等。
业务流程建模与标注BPMN:
- 流对象(Flow):事件、活动、网关。
- 连接对象(Connection):序列流、消息流、关联。
- 泳道(Swinlane):过程中的业务实体(参与者)。
- 人工信息(Artifact):数据对象、组、注释。
可视化建模基础
统一建模语言UML:图形化和形式化描述需求。
用例视图(用例图):
- 用例:系统外部可见的系统功能单元。
用例文档化:简要描述、参与者、前置条件、主事件流、备选流、后置条件。 - 参与者:外部的人或事物针对用例所扮演的角色。
- 关系:关联、包含、扩展、泛化。
关联:参与者与用例之间的关系。
包含(include):箭头指向被包含用例。
扩展(extend):箭头指向被扩展用例。
泛化:一般和特殊的关系,空三角形箭头从特殊(子类)指向一般(超类)。
活动视图(活动图):
- 动作:活动由若干动作组成。
- 控制流:从一个动作到下一个动作控制的流程。
- 关系:迁移、分支、分叉、结合。
迁移:活动的完成与新活动的开始。
分支:根据条件控制执行方向。
分叉(fork):以下的活动可并发执行。
结合(join):以上的并发活动再此结合。
结构视图(类图):
- 类(Class):一组具有相同数据结构和数据操作的对象集合。
如何从功能性需求分析中抽取类:抽取候选类、判定候选类、合并/扩展。 - 类名:实体类(正体)、抽象类(斜体)。
- 类属性:[可见性] 属性名称:[属性类型][=初始值]
- 类操作:[可见性] 方法名称([参数])[:返回类型]
可见性:+表示public、-表示private、#号表示protected。 - 类关系:关联、聚合、复合、泛化。
关联:类属性与其它类关联。
聚合(aggregation):删除整体不一定会删除部分,用空心菱形表示。
复合(composition):删除整体一定会删除部分,用实心菱形表示。
泛化:继承、可替换性、多态性。
交互视图:
活动图和交互图的异同:
- 同:用例的实现、具有过程。
- 异:交互图的抽象级别低、一个活动图可能对应多个交互图。
顺序图和通信图可以相互转换。
顺序图(时序图):强调对象间时间顺序。
- 生命线:表示对象存在的时间。
- 激活:表示此时间段内对象执行相应操作。
- 消息:
同步消息:发送者停止活动,等待接收者放弃或返回控制,用实三角形箭头表示。
异步消息:接收者和发送者是并发工作的,用普通箭头表示。
返回消息:表示从过程调用返回,用虚线箭头表示。
通信图(协作图):强调对象间通信消息。
- 箭头表示消息,没有生命线和激活。
状态机视图(状态图):
- 状态:在对象生命周期中的某个条件或者状况。
- 转换:事件(参数) [守卫]/动作
实现视图:
构件图:系统物理视图,显示构件间的依赖关系。
- 构件(component):系统中可重用的模块封装为具有可替代性的物理单元。
接口:提供接口、依赖接口。 - 子系统(subsystem):继承构件的概念,封装系统行为的某些部分。
- 包(package):一组高度相关类的聚合,划分程序的逻辑模型。
部署图:系统运行时的结构,展示硬件的配置及其软件如何部署到网络结构中。
- 节点:可以是硬件也可以是运行其上的软件系统,用立方体表示。
- 通信:节点之间的连线。
需求规格说明
体系结构:定义了系统中相互作用的软件构件与子系统的结构与组织形式。
模型-视图-控制器MVC:
- 模型(Model):接受视图请求的数据,返回最终的处理结果。
业务模型:业务流程/状态的实际执行以及业务规则的维护。
数据模型:实体对象的数据保存。 - 视图(View):用户交互界面。
- 控制器(Controller):决定选择什么样的模型和视图来可以完成特定的用户请求。
J2EE核心体系结构:
表示-控制器-bean-中介者-实体-资源PCBMER:
- 原则:向下依赖原则DDP、向上通知原则UNP、相邻通信原则NCP、显式关联原则EAP、循环去除原则CEP、类命名原则CNP、相识包原则APP。
需求规格说明:
状态规格说明:
- 发现类(类建模):名词短语法、公共类模式法、用例驱动法、CRC(类-职责-协作者)。
- 发现关联(关联建模):类的属性是其他类、从用例中发现、循环关联。
- 说明关联(关联建模):确定关联的多重性、异或约束Xor。
- 接口(interface):接口没有属性、关联或状态,接口只有操作。
- 表示接口(接口建模):使用(use)接口用虚线箭头表示,实现(implement)接口用空三角形虚线箭头表示。
行为规格说明:
- 发现用例(用例建模):一个功能性需求可以直接映射为一个用例。
- 发现动作(活动建模):对描述用例的叙述性规格说明进行语句分析。
- 发现消息(交互建模):活动图中的动作映射为顺序图中的消息。
- 发现操作(操作建模):顺序图中的每一个消息都有目标对象的一个操作为其服务。
状态变化规格说明:
- 发现状态:不是所有属性都能决定状态变化。
从分析到设计
高级类扩展:
- 构造型:扩展已有类型和类的语义,但不改动结构。
- 注释:文本解释,对元素的语义没有影响。
- 约束:条件或限制,语义的申明。
- 标签:通过名-值对丰富模型语义,模型元素必须定义一个带有标签定义的构造型。
- 导出信息:一种应用于属性或关联的约束,从其他模型元素获得。
- 关联类和具体化类:
关联类:两个类之间存在多对多的关联,且每个关联实例都有自己的属性值。
关联类需要满足一个约束:对于每一个类A实例和类B实例之间的关联,只能存在一个类C的实例。
具体化类:若不满足约束,则要用一个普通类D代替类C,并在类D与类A和B之间分别建立二元关联。
高级泛化与继承建模:
- 扩展继承:子类具有比超类更多的特性(属性或方法)。
- 限制继承:有一些超类特性在子类中被禁止(重载)。
- 方便继承:任意选择一个类作为其他类的父类。
两个类具有相似的实现,但不属于同类,不应该采用方便继承。
高级聚合与委托建模:
- 复合:物理包含,同一个对象只能属于一个复合对象。
ExclusiveOwns聚合:存在依赖性、传递性、非对称性、固定性。
Owns聚合:存在依赖性、传递性、非对称性。 - 聚合:非物理包含,同一个对象可以有多个聚合。
Has聚合:传递性、非对称性。
Member聚合:多对多。
高级交互建模:
-
生命线与消息:
-
片段:
alt:可选片段,如果守卫条件中表达if-then-else条件逻辑。
opt:选择片段,如果守卫条件为真,执行该片段。
loop:循环片段,服从循环片段而重复多次的片段。
break:中断片段,如果中断条件为真,执行该片段。
parallel:并行片段,允许所包含行为交替执行。
体系结构与程序设计
设计模式:
- 外观(Facade):为子系统提供一个高层接口,来隐藏子系统的复杂性。
- 抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 责任链(Chain of Responsibility):为请求创建一个接收者对象的链。
- 观察者(Observer):定义对象间一对多的依赖关系,当一个对象变更状态时,其所有依赖着都被通知到并自动更新。
- 中介者(Mediator):提供中介类处理不同类之间的通信,支持松耦合。
程序设计(详细设计):每次只关注一个应用程序,扩展GUI和DB设计。
- 程序设计的目标:将分析模型转换成详细设计文档。
- 类内聚与类耦合:
类内聚(Class cohesion):类的内部自确定的程度,度量类的独立性。
类耦合(Class coupling):类之间联系的程度,度量类的相互依赖性。 - Demeter法则:限制类间任意通信。
消息的目标只能是:对象本身、方法参数引用的对象、属性引用的对象、方法创建的对象、全局变量引用的对象。
应用:外观模式、中介者模式。
问题:在系统里造出大量的小方法、不同模块之间的通信效率降低。 - 存取方法与机械类:
存取方法定义观察者(get)或改变者(set)操作,限制其它类访问自身的状态。
具有许多存取方法的类会有变成机械类的风险。 - 动态分类与混合实例内聚:
动态分类:对象在不同时刻属于不同类。
混合实例内聚:一部分属性仅对一部分对象有意义。 - 复用策略:
复用技术:继承、委托、代码拷贝。
复用粒度:类、构件、解决方案。
复用策略:工具包 (类)、框架(构件)、模式(开发方法过程)。
协作建模:不同实体相互协作完成共同工作。
- 协作:用虚线椭圆表示。
- 实体:用矩形表示,由连接器连接。
用户界面设计
图形用户界面GUI:采用图形方式显示的计算机操作用户界面。
- GUI设计原则:方便用户控制、美观与实用、减少用户记忆负担、界面一致性、个性化。
- GUI原型设计方法:
桌面GUI设计方法:
- 主窗口设计:列表窗口、多窗口、树型列表窗口;
- 子窗口设计:对话框、标签页、下拉列表、消息框;
- 菜单与工具栏设计;
- 按钮与其它控件设计。
Web GUI设计方法:
- WEB应用:供浏览器访问的Web程序,可访问静态页面和动态页面及数据库。
- 页面布局设计、页面交互设计、页面内容设计。
- Web标准化布局:结构(HTML)、样式(CSS)、行为(JavaScript)。