1. 软件设计概述
1.1 软件设计的目的
软件设计是在系统设计或者概要设计的基础上,将系统设计进行细化,确定模块划分、模块之间的接口定义、系统中的数据构成等事项,从而确定怎样通过编码来实现系统功能的一个阶段。软件设计是编码工作的基准,主要输出文档是软件设计书。
1.2 软件设计的前提
在进行软件设计前,项目前期需要完成的资料如下:
- 系统功能用例列表
- 系统业务流程说明
- 系统软硬件构成
- 系统使用的核心算法
- 系统设计方针
- 系统软件构成
- ER图及数据项目清单
- 画面列表及画面迁移图
- 画面UI设计原则
- 指导详细设计的文档规约,设计规约等
1.3 软件设计的内容
软件设计书的主要内容包括以下几方面:
-
项目背景介绍:项目系统的名称,目的,使用方法等相关信息,进行概要说明。
-
项目整体概要介绍:对详细设计的整体方针进行介绍,包括开发语言和开发技术,系统架构等。
-
设计方针:包括模块划分方法,如何复用,如何处理错误和异常,如何实现可扩展性、可靠性、安全性和性能
方面的要求,如何进行日志处理及测试等。
-
系统模块设计
-
系统数据设计
-
画面设计
-
表设计
-
数据量与性能设计
-
错误处理及错误信息一览
2. 系统架构(软硬件环境)
软件设计过程中要详细确定软件,硬件,中间件的具体信息,特别是一些限制,根据这些限制调整软件设计的策略。软件设计过程的输入输出内容如下:
输入内容:
- 系统设计书
输出内容:
- 使用的软件版本,安装目录列表
- 配置管理工具以及项目中的各种文件及源代码存储说明
- 特殊硬件的数量及规格说明
- 中间件产品的说明书,以及由此造成的开发限制的说明
2.1 系统软件
- 确定开发和运行使用的操作系统类型和版本
- 确定数据库类型版本
- 确定开发工具和版本
- 确定软件设计文档使用的Office版本,不同版本的Office编写的文档整合起来比较困难
- 确定配置管理使用的软件
- 确定使用浏览器类型和版本
- 确定APP客户端的支持类型和版本
2.2 系统硬件
- 确认开发使用的PC机
- 开发使用的服务器
- 确认开发过程中需要使用的特殊的硬件产品。例如:特定型 手机、特殊型 的打印机以及对字体的支持
2.3 中间件版本
- 确定应用服务器的版本。例如:Tomcat 8.0.53
- 确定Web服务器和版本。例如:Nginx-1.15.8
- 确定消息服务器和版本。例如:RabbitMQ、ActiveMQ
- 确定第三方类库和版本。例如:druid、mybatis
- 确定使用的开源框架产品和版本。例如:SpringBoot(后端)、Vue(前端)
2.4 测试环境
为了保证测试的有效性,测试环境必须能够模仿真实的生产环境,在可能的情况下应该保证测试环境与真实环境一致。在准备测试环境的时候要注意一下问题:
- 操作系统的类型和版本
- 数据库系统的类型和版本
- 客户端浏览器的类型和版本
- 开发使用程序包、类库、中间件的版本和限制
- 针对于一些特殊的,需要 License才能运用的软件应该取保在测试开始之前有开发版的License
- 特殊的硬件设备,例如:特殊的打印机,在没有特殊设备需要替代设备时一定要经过客户确认
- 在满足测试环境要求的同时,制定完善的测试计划,测试计划必须能够可执行,可衡量
3 系统模块设计
模块设计在整个软件设计中是非常重要的一个部分。进行模块设计需要根据模块设计的原则,进行模块的抽取划分,并进行最终的模块详细设计。
3.1 模块设计三原则
模块泛指软件系统的功能,每个模块都具有特定的、明确的功能。模块设计的核心工作是接口的设计和数据结构与算法的设计。在模块设计时我们遵循以下几个原则:
3.1.1 信息隐藏
我们设计的模块应该仅仅公开必须让外界知道的东西,而隐藏其他一切内容。接口是模块的外部特征,应该公开;而数据结构、算法实现体是模块的内部特征,应当隐藏。如果一个模块是一个类(Class),那么这个模块的接口就是该类的公共函数。
3.1.2 高内聚
内聚是一个模块内部各成分之间相关联程度。我们设计模块时应该尽量争取模块的各成分之间关联程度紧密结合。
3.1.3 低耦合
耦合是模块之间的依赖程度。耦合的强度通常依赖于以下几个因素:
- 一个模块对另外一个模块的函数调用数量
- 一个模块向另一个模块传递的数据量
- 模块之间接口的复杂程度
模块设计应当争取“高内聚,低耦合”,而避免“低内聚,高耦合”。
3.2 共通模块的抽取
在模块设计时共通模块的抽取有一个非常重要的原则。原则上,只要某一功能被不同的模块调用两次以上,就应该作为共通模块抽出来。
3.2.1 抽出共通模块好处
- 减少软件开发时的冗余代码,减少作业量
- 当发生需求变更时要修改共通模块时,减少变更的工作量
- 有助于提高开发的生产效率和软件的质量
3.2.2 抽出共通模块注意事项
- 适度抽出。模块划分过细,会增加程序的复杂性,从而抵消了共通模块带来的好处。
- 保证品质。最好由经验丰富的开发人员来参与共通模块的设计和编码。
- 严格审查。对共通模块,要加强审查的频度和力度,减少变更,因为它会影响到很多其它模块。
当发生式样变更要修改共通模块时,有可能扩大变更的影响范围。
3.2.3 常用抽取共通模块
- 日志处理
- 数据库操作
- 错误处理
- 数据类型处理
- 文件读写操作
- 数据类型处理(类型转化、日期处理等)
- 用户输入检验(如是否为数字、半角等)
3.3 模块设计的工作
模块设计包括以下几方面的工作:
- 描述:介绍模块相关信息
- 功能:简要介绍该模块在系统中的作用,属于哪一部分,实现哪些功能
- 接口:模块中函数或方法的定义
- 输入项:模块的参数
- 输出项:模块的返回结果
- 处理流程:按照一定的逻辑顺序,描述模块根据输入得到输出的处理步骤。可以用图表(如流程图……)
辅以必要的说明来更形象地表达 - 数据结构:模块中用到的复杂数据类型
- 限制条件:说明程序运行中所受到的限制条件
- 核心算法:模块中用到一些较复杂的算法,程序说明具体的计算公式和计算步骤
- 性能要求:程序说明对模块的性能要求,包括对精度、灵活性和时间特性的要求
- 数据库逻辑结构:模块中的处理涉及到数据库,将相关数据库的结构程序说明
4 数据设计
4.1 文件格式设计
定义文件构成格式,包括字段长度,分隔符,不足位时补充空格等约束,制订整体规范。
- 异常信息文件格式
- 日志文件格式
- 配置文件格式
4.2 数据库设计
数据库设计输出内容:数据表构造图、数据项目列表、索引列表、视图列表。
4.2.1 数据对象设计
-
用户:说明除数据库安装时系统自带用户外的所有用户,及其对应的角色和权限。
-
表:说明除数据库安装时系统自带系统表外的所有表结构,包括表名,字段名,数据类型,长度,
主键,外键,索引,访问权限,存储空间 -
视图:视图物理名,视图的定义
-
抽象数据类型:抽象数据类型物理名,抽象数据类型的定义
-
触发器:触发时间(before和after),触发条件(insert,update,delete),触发子类型(行触发和语句触发)。
-
存储过程:存储过程物理名,输入参数,输出参数,使用权限,功能说明
-
函数:函数物理名,输入参数,返回值。
4.2.2 数据库数据设计
-
事务处理量:系统每秒的事务处理量的累计值
-
处理时间:处理一个事务所需要的时间。这个过程包括客户端向服务器发出请求、服务器做出响应以及客户端接收到服务器应答所需要的时间。
-
并发量:最大的同时连接数。
5 画面UI设计
整体根据系统设计书中的画面Layout、画面一览和画面迁移,进行画面共通部分(多个画面中存在。 例如:异常信息显示、共通的画面头等)、业务部分(画面独特的功能、处理。例如:用户登录等)的功能整理,并作成详细设计书中的画面项目说明文档。
- 项目名称:画面中表示项目的名称。例如:登录按钮
- 项目ID:用英文、数字等表示的项目名,以便于在程序中使用。例如:BTN001
- 项目类型:项目空间的类型描述。例如:按钮、下拉框
- 宽度、高度:项目的表示宽度、表示高度
- 必须、可选:项目的内容是必须输入还是不必须输入的
- 默认值:和变量设初始值一样,文本框、单选按钮、复选按钮等项目最好设定默认值
- 文字:文字的字体、颜色和大小
- 背景色:有的时候需要对有焦点和没有焦点设定不同的背景色
- 显示位置:表示内容的水平对齐和垂直对齐
- 显示格式:显示内容的时候,一些特殊的格式要求。例如:四舍五入、金额数字中的间隔 等
- 光标移动:按TAB、ENTER等功能键的时候,光标如何在画面中移动
- 输入文字数: 可以输入的最大文字数,
- 数据输入输出:该画面项目与数据库哪张表、哪个字段对应,以及与数据库进行数据交换的条件、方法
6 错误处理设计
6.1 错误处理原则
- 分层:模块在函数调用中的层次不同,每一层都分别捕获和处理不同的错误。
- 集中处理:所有的错误处理,最终都由一个共通的错误处理模块来处理,包括记录日志、显示 错误消息等。
6.2 错误处理步骤
- 在调用的最底层,捕获所有错误。已知错误,调用错误处理模块;未知错误,抛给上层。
- 在调用的中间层,将底层的错误抛给上层。
- 在调用的最高层(通常是画面按钮),捕获所有错误,调用错误处理模块。
6.3 错误处理措施
软件系统中的错误通常可分为以下三种类型:
- 操作错误:用户通过系统画面与系统交互时不满足输入规则、输入范围等发生的错误。
- 处理:校验用户输入,提示正确规则。
- 运行错误:软件系统与外部环境交互时发生的错误,如 络、文件系统、数据库、其它业务应用系统等。
- 处理:记录日志,显示错误消息,终止系统运行或允许用户采取补救措施后,重新操作。
- 程序员错误:由于编码不慎导致发生的错误,如空指针等。
- 处理:修正代码。
6.4 错误信息记录
通过日志记录捕获到的每个错误的原始信息,包括错误发生函数、错误发生模块、错误详细描述等。另外,关于函数调用中由参数不符引发的错误,可分为两种情况:
- 详细设计的接口说明当中,明确列出了参数不允许的非法值。这样开发人员在调用该函数时,应该避免传入非法值。如果出现此类错误,就是程序员错误。
- 详细设计的接口说明当中没有明确列出哪些参数值是非法的,这样开发人员需要在该函数内部的处理开始添加非法参数的校验。
7 软件设计收尾
软件设计阶段的收尾时,需要检查如下内容:
- 参照系统设计书以及需求文档,确认所有的机能都已经被设计,没有发现遗漏。
- 所有的软件设计书经过了内部的Review或者同行评审,并且Review发现的问题已经修正完毕。
- 所有的文档都遵循了之前确定的软件设计书模版,并且在打印预览模式下进行了检查,确认文档能够正常被打印出来。
- 将软件设计书的文档进行整理定版存放在了指定位置作为下阶段编码工作的指导。
8 后记
以上,基于今年的特殊情势,在家闲暇之余,梳理了近些年来的开发过程,就自己感觉重要的部分进行了整理,供大家参考。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!