结构化设计
一. 简介
1. 结构化设计的内容
结构化的系统设计主要考虑:模块的层次化、模块之间的接口、数据库设计、用户界面设计
为每个模块设计内部逻辑
采用自顶向下方法进行设计:具有系统自动化边界的DFD、结构图
2. 自动化系统边界划分
将数据流图划分为手工处理部分和系统能自动完成的部分
程序的处理过程可以在系统边界内部或外部
数据流可以在系统边界内部或外部
穿过系统界线的数据流代表了系统的输入和输出
在最终的系统中,数据流将成为用户界面中的表单、报表、供其他系统使用的数据文件等
二. 结构图
1. 简介
结构图的定义:以模块为基础、以模块间的调用为关联所构成的图称为模块结构图,简称结构图。
结构图的作用: 层次化的方法来描述系统每部分的功能和子功能、展示计算机程序模块之间的联系
结构图符号:
2. 结构图创建
主要步骤:
- 确定主要信息流
- 代表输入和输出间最基本变化的过程
- 重画数据流,将输入放左边,输出放右边
- 初步建立一个结构图草图
- 加入其他模块实现功能:数据输入、数据处理、数据输出
- 使用结构化语言或决策树添加模块间逻辑
- 进一步求精
三. 结构化设计——DFD到系统结构图
- 事务性:几条路径不全用
- 复杂变换型:几条路径全部使用
扇入扇出度限定
面向对象设计
一. 面向对象设计概述
1. 面向对象的设计
- 传统结构化方法:分析阶段和设计阶段分得特别清楚,两套不同的建模符号和建模方法
- 面向对象设计(OOD):采用统一的“对象”的概念,阶段区分不明显,仍然使用“类、属性、操作”等概念,是在OOA(面向对象分析)基础上的进一步细化,更加接近底层的技术实现。
2. 面向对象设计中的基本元素
- 基本单元:设计类——对应于OOA中的分析类
- 为了系统实现和维护过程中的方便些,将多个设计类按照关联的紧密程度聚合到一起,形成大颗粒度的“包”
- 一个包或多个包聚集在一起,形成“子系统”
- 多个子系统构成完整的“系统”
3. 面向对象设计的两个阶段
- 系统设计: 概要设计(体系结构),选择解决问题的基本途径(框架、平台、工具等),系统结构风格
- 对象设计: 详细设计(具体实现),细化新的对象,识别新对象,在系统所需的应用对象与可复用的商业构件之间建立关联
二. 系统设计
见上图
- 系统体系结构
- 识别设计元素:类、包、子系统
- 部署子系统
- 数据的存储策略
- 检查系统设计
三. 包的设计
- 分析类简单,逻辑抽象单一,一对一映射为设计类
- 分析类复杂,分解为多个设计类,映射为包或子系统
- 子系统/包的划分符合高内聚低耦合的特性(对外清晰)
一般来说,把在语义上接近且倾向于一起变化的类组织在一起形成包(业务和逻辑上联系)
- 概念语义相近
- 功能相关性:变更联系、删除后另一个变多余、频繁交互通信、一般/特殊关系、激发创建另一个类
包之间的关系:依赖(<
包图:
- 类似于文件夹的符号
- 组织元素的方式,组织任何事物:类、其他包、用例等
四. 对象设计
1. 概述
- 对象设计:细化需求分析和系统设计阶段产生的模型、确定新的设计对象、消除问题域和实现域之间的差异
- 主要任务:精细化属性(参数和基本实现结构)和操作(类型和可见性)、明确类之间的关系、整理优化设计模型
2. 基本步骤
2.1. 创建初始的设计类
分析类
2.2. 细化属性
- 具体说明属性的名称、类型、缺省值、可见性:visibility attributeName: Type = Default
- 属性来源:实体基本信息、状态信息、其他类之间关联信息、派生属性(需要计算其他属性的值才能得到,属性前加“/”)
- 可见性尽可能private,调用函数set更新、get访问
- 状态属性:大部分由其他属性值进行逻辑判断得到,状态值变迁是由实体类操作导致的
- 关联属性:关联属性不只是一个ID,而是关联的一个或多个完整的对方类的对象,和数据库中的外键区分,在程序运行空间实现object之间导航,无需经过数据库层存取
2.3. 细化操作
- 给出完整的操作描述:确定操作的名称、参数、返回值、可见性等,遵从程序设计语言命名规则
- 详细说明操作的内部实现逻辑:伪代码或者绘制程序流程图/活动图
- 提取公共部分
2.4. 定义状态
2.5. 细化类之间的关系
细化关系:关联关系、依赖关系、继承关系、组合和聚合关系
关联关系(Association/Composition/Aggregation)
辅助实体类,是对从用例中识别出的核心实体的补充描述,目的是使每个实体类的属性均为简单数据类型——目的:使用起来更容易
五. 面向对象设计总结
数据库设计
一. 数据库系统及关系数据库简介
数据库系统=数据库(DB)+数据库管理系统(DBMS)
- 数据库DB:集中控制和管理的存储数据完整集合
- 概念(名字)、逻辑(名字、属性)、物理(名字、属性、属性类型、主键外键)
- 数据库系统DBMS:对数据库的访问进行管理和控制
- 允许同时访问数据库
- 无需应用程序就可以访问
- 管理已存储数据
- 关系数据库
- 关系数据库管理系统将数据存储为表(关系)的结果
- 元组:表中的行(也称为一条数据记录),域:表中的列(也成为属性)
- 表包含关键字(关键属性,key fields),用来唯一标识一条记录
- 关键字是表间关系的基础
二. 数据库逻辑模型设计——ERD
- 识别自然数据实体(Entity):DFD中全部数据存储,分析类图中部分类
- 数据实体命名
- 给出实体属性
- 实体间关联关系和关联重数(1:1、1:M、M:N)
- 建立关联实体来消除M:N重关系
- 实体规范化(3NF,第三范式)
- 评价ERD质量并改进
三. ERD模型及质量评价
好的ERD标准:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余(重复性冗余)
数据库的规范化
- 1NF:没有重复的属性或属性组,同样的内容不重复(e.g. 课程1、课程2、课程3)
- 2NF:是1NF且每个非主属性均函数依赖于主属性(主键)(e.g. ID)
- 3NF:是2NF且非主属性间均不存在函数依赖
为了提高运行效率,必须适当降低范式标准,保留冗余数据。
四. 物理数据库设计及建立
根据ERD建立物理数据库
- 为每个实体创建一个二维表
- 为每个字段选择适当的数据类型和取值范围
- 定义每个表的主键(PK-Primary Key)
- 针对1:M关联关系的子表添加外键(FK-Foreign Key)
- 定义三个方面完整性约束
- 域的完整性:字段取值范围
- 参照完整性:PK、FK、表级触发器来实现
- 用户定义完整性:定义一些业务规则,用存储过程和触发器来实现
五. 物理数据库提高效率的技巧
六. 描述分布式数据库的不同的体系结构模型
单数据库服务器体系结构
带备份的数据库服务器体系结构
将数据库模式划分为多个客户访问子集
分区数据库服务器体系结构
联合数据库服务体系结构
七. OO分析类图映射到ERD
1. 类和关系数据表的关系
OOP以class为基本单位,所有的object都是运行在内存空间当中
若某些object的信息需要持久化存储,那么就需要用到database,将object的属性信息写入关系数据表
在进行OO分析和设计时完全可以将database忘掉,后续再加以考虑
2. 数据存储设计
数据文件:由操作系统提供的存储形式,应用系统将数据按字节顺序存储,并定义如何以及何时检索数据
关系数据库:数据是以表的形式存储在预先定义好的成为Schema的类型中
面向对象数据库:将对象和关系作为数据一起存储
存储策略的选择:取决于非功能性的需求
数据存储策略权衡 tradeoff
- 文件:大容量、临时数据、低信息密度数据
- 数据库:并发访问要求高、系统跨平台、多个应用使用相同数据
- 关系数据库:复杂数据查询、数据集规模大(子系统来完成应用系统中的对象和数据库中数据的映射与转换)
- 面向对象数据库:中等规模、频繁使用对象间联系来读取数据(提供接口供应用系统访问)
3. OO设计中的数据库设计
核心问题:对那些需要永久性存储的数据,如何将UML类图映射为数据库模型
本质:把一个类、类之间的关系分别映射到一张表或多张表(UML class diagram
两方面:类映射到表,关联关系映射到表
对象关系映射(Object Relational Mapping, ORM):解决面向对象与关系数据库存在的互不匹配的现象
基于关联类的关联关系:
将继承关系映射到关系数据库:
1:1
1: *
*** : ***
一般来说,关联表一定有两个外键,并且会增加属性才有意义
循环:* *
继承关系
还可以只建立一张表
思考
八. 关系型数据库规范化示例
用户界面设计
一. 用户界面设计的基本概念
广义人机界面:人和机器、设备之间存在的一个相互作用的“面“,e.g. 键盘、显示器、音响、方向盘、仪表等
狭义人机界面:计算机系统,又称为人机接口、用户界面
软件用户界面包含:界面元素的样式、大小、布局;界面的美观效果(色彩、风格、图像)声音/触觉等;操作序列或功能的隐喻,e.g. 视觉引导;交互信息(输入、输出、提示)
用户界面设计:用户界面完成结构设计、交互设计和视觉设计,从而使软件达到易学、易用、美观、高效的目的
用户界面设计基本过程:分析软件需求
用户界面设计标准:可学性、效率性(缺省值)、记忆性、容错性、满意度
二. 用户界面形式及设计原则
1. 用户界面分类
第一代:CUI——字符用户界面,character user interface
第二代:GUI——图形用户界面,graphics user interface(鼠标为主、键盘为辅)
第三代:MUI——多通道用户界面,multimodal user interface(多媒体,麦克风、手写板、摄像头、音响等)
从软件功能角度分类:
- 操作系统用户界面
- 文字处理软件用户界面
- 工业控制系统用户界面
- 管理信息系统用户界面
- 网页用户界面
- 移动工具用户界面
- 游戏软件用户界面
2. 用户界面风格
从视觉观感上,图形化界面风格:
一致性风格
个性化风格
传统式风格
古典式风格
现代派风格
高科技风格
卡通式风格
插画式风格
3. 用户界面形式及设计原则
用户界面形式(五种):
- 命令语言界面
- 优点:功能强大(一条命令完成多次转移或多次问答),灵活性好,效率高,占用屏幕空间少
- 缺点:难以学习记忆、需要键盘输入技巧、出错可能性大
- 结构:关键词(+参数)、基于语法、基于自然语言
- 菜单界面
- 形式:单一菜单、线状序列菜单、树状结构菜单、非循环网络菜单、循环网络菜单
- 式样:全屏幕文本菜单、条形菜单(屏幕顶部或底部)、弹出菜单、工具栏、下拉式菜单、图标菜单、滚动菜单、浮动菜单
- 数据输入界面
- 数据输入方式:问答式对话输入、菜单选择输入、填表输入、直接操作输入界面(点击对话,单选复选框等)、关键词数据输入(关键词+参数,类似于命令行)、条形码和光学字符识别(OCR)、声音数据输入
- 交互式数据输入界面设计原则:数据输入一致性、用户输入减少至最少(缺省、系统复制)、信息反馈、灵活输入、错误检测和修改机制
- 填表输入数据方式:填表界面系统驱动,输入字段同时显示在屏幕上,同时进行多字段输入,上下文信息
- 集中数据项布局及显控协调问题(集中数据项布局原则)
- 随意布局
- 接近性原则(物理距离拉开)
- 相似性原则
- 完整性和闭合性原则
- 集中数据项布局及显控协调问题(显控协调布局原则)
- 重要性原则
- 操作频率原则
- 功能分组原则
- 操作次序原则
- 直接操纵和WIMP界面
- 所见及所得
- WIMP: Windows-down menu(图形方式)
- 窗口的分类:滚动式窗口(上下翻动可看全部信息)、开关式窗口(只能显示一个)、分列式窗口(水平分区)、瓦片式窗口(水平或垂直规则划分为不重叠子屏幕)、重叠式窗口、弹出式窗口
- 提示、帮助和出错界面
- 出错设计原则:错误预防、错误恢复(undo、redo)
用户界面设计总原则(12条):
一致性原则
提供信息提示与反馈
合理利用空间、保持界面简洁
合理利用颜色与显示效果
实现内容与形式的统一
恰当使用图形和形象比喻
用户出错宽容性
尽量提供快捷方式
尽量允许操作可逆性(Undo与Redo)
尽量减少用户的记忆性要求
合理的系统响应和低的系统成本
良好的联机帮助(Help功能)
三. WIMP用户界面设计
1. 窗口设计
标题、图标,可缩放,可最大化、最小化,可移动,有滚动条,边框风格,光标风格,背景图案
2. 菜单设计
下拉式菜单、弹出式菜单、线性菜单、快捷方式、动态菜单项(涉及到权限,灰显菜单项、隐藏菜单项、位置可变菜单项、内容可变菜单项)、菜单项图标
3. 填表输入界面设计
提示(标签、提示信息)、输入与编辑、选择(单选radiobutton、多选checkbox)、帮助功能
4. 操作控制元素设计
按钮(普通按钮、位图按钮-带图标)、控制焦点(方法SetFocus)、滚动条、进度条
5. 声音输出界面设计
调用Delphi一个音频播放函数
PlaySound(pchar(filename),0,snd_async);//异步
PlaySound(pchar(filename),0,snd_synch);//同步
6. 图标设计
用已经设计好的*.ICO文件
读入已有的图片(.bmp, .jpg等)进行再编辑或修改
抓取屏幕局部图像再编辑或修改
纯像素画设计
7. 个性化界面设计
.bmp
界面换肤
8. UnDo/ReDo设计
建立一个数据结构,保护每个对象产生前的现场:操作序列和结果数据;
该数据结构是个环形栈(栈底不固定);
UnDo时做类退栈操作,恢复现场;
ReDo时,将由于UnDo退出的栈元素再压入栈(只有当UnDo后无新的操作产生才可做)
四. 网页界面设计
五. 缺省设计问题
场合:文本编辑框、输入选择框(列表框、组合框、单选框、多选框)、功能按钮(其上的焦点)
目的:减少用户输入数据,提高系统使用效率
原则:考虑使用效率,从统计结果看输入平均量(含清除缺省值的输入量)< 无缺省值情况下的平均输入量
缺省值设计方法
- 用户操作设置缺省值(强制值输入)
- 经验值作为缺省值
- 统计方法确定出现几率大的值作缺省值
- 安全需要设置缺省值
- 最近使用的值作缺省值
- 输入数据的上下文关联缺省值
- 当前状态值
- 逻辑强制关系互为缺省值
- 正常操作序列选择作为缺省值
- 树状隶属关系约束选项列表
- 智能焦点
六. 输入验证设计问题
场合:文本编辑框、功能菜单或按钮
目的:可能的情况下,保证数据有效性、合理性,减少错误,提高效率,保证安全
输入验证的内容及方法:
- 数据位数验证
- 字符集验证
- 范围验证
- 合理性验证
- 数据格式验证
- 安全性验证
- 异常性验证
七. 系统响应及信息反馈问题
系统响应内容及方法:
- 立即确认用户的输入
- 提供忙状态提示(静态图标,等待动画:动态沙漏等)
- 任务进度指示器
- 虚拟进度(只是忙反馈)
- 非精度进度(近似估计)
- 动态调整显示进度(进/退)
- 进度显示的任务粒度(最小进度单位表示任务量)
- 时间方式显示进度(剩余时间)
- 百分百形式显示进度
- 工作任务动态(正在处理某文件,正在计算第X个单元)
- 趣味进度:沙漏形式、广告倒计时
- 首先反馈重要信息
- 处理任务分解、化整为零
信息反馈的内容及方法:
- 反馈信息明确具体
- 建设性指导原则与积极的基调
- 以用户为中心的措辞
- 非拟人化的设计