【概述】
软件设计是所有软件工程活动和随后的软件支持活动的基础,其是一个迭代的过程,通过设计过程,需求被变换为用于构建软件的蓝图
McGlaughlin 提出了可以指导评价良好设计演化的 3 个特征:
- 设计必须实现所有包含在分析模型中的明确需求,而且必须满足用户期望的所有隐含需求
- 对于程序员、测试人员和维护人员而言,设计必须是可读的、可理解的指南
- 设计必须提供软件的全貌,从实现的角度说明数据域、功能域和行为域
【软件设计分类】
软件设计可以从活动任务观点和工程管理观点分别对其分类
活动任务观点
从活动任务来看,软件设计是对软件需求进行设计:
- 数据设计:数据设计创建在高抽象级别上表示的数据模型和信息模型。然后,数据模型被精化为越来越多和实现相关的特定表示,即基于计算机的系统能够处理的表示
- 体系结构设计:体系结构设计为我们提供软件的整体视图,定义了软件系统各主要成份之间的关系
- 接口设计:接口设计告诉我们信息如何流入和流出系统以及被定义为体系结构一部分的构件之间是如何通信的
- 构件设计:构件设计完整的描述了每个软件构件的内部细节,为所有本地数据对象定义数据结构,为所有在构件内发生的处理定义算法细节,并定义允许访问所有构件操作的接口
- 部署设计:部署设计指明软件功能和子系统如何在支持软件的物理计算环境内分布
工程管理观点
从工程管理角度来看,软件设计分为概要设计和详细设计,前期进行概要设计,得到软件系统的基本框架。后期进行详细设计,明确系统内部的实现细节
概要设计确定软件的结构以及各组成部分之间的相互关系,其以需求规格说明书为基础,概要地说明软件系统的实现方案
概要设计包括目标系统的总体架构、每个模块的功能描述、数据接口描述及模块之间的调用关系、数据库、数据定义和数据结构等
其中,目标系统的总体架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素之间的相互作用、指导元素集成的模式以及这些模式的约束组成
详细设计确定模块内部的算法和数据结构,产生描述各模块程序过程的详细文档。它对每个模块的功能和架构进行细化,明确要完成相应模块的预定功能所需要的数据结构和算法,并将其用某种形式描述出来
详细设计的目标是得到实现系统的最详细的解决方案,明确对目标系统的精确描述,从而在编码阶段可以方便地把这个描述直接翻译为用某种程序设计语言书写的程序
在进行详细设计的过程中,设计人员的工作涉及到的内容有过程、数据和接口等。过程设计主要是指描述系统中每个模块的实现算法和细节,数据设计是对各模块所用到的数据结构的进一步细化,接口设计针对的是软件系统各模块之间的关系或通信方式以及目标系统与外部系统之间的联系
【数据库结构设计】
数据库结构设计包括概念结构设计、逻辑结构设计和物理结构设计
概念结构是系统中各种数据模型的共同基础,它描述了系统最基础的数据结构,独立于特定的数据库系统
逻辑结构提供了比较接近数据库内部构造的逻辑描述,它能够为数据库物理结构的创建提供便利
物理结构是指数据库的物理数据模型,它包括数据库服务器物理空间上的表、存储过程、字段、视图、触发器、索引等,与特定的数据库系统密切相关
【用户界面设计】
概述
用户界面设计是接口设计的一个组成部分
对于交互式系统来说,用户界面设计和数据设计、体系结构设计、过程设计一样重要,用户界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命,因此,必须对用户界面设计给予足够重视
设计活动是基于一定的目的与流程的,它明确设计活动的最终方向,并保证设计活动的正确性和高效率
设计驱动开发
作为应用程序开发者,在设计应用程序的过程中必须遵循同类软件乃至其所运行的操作系统的使用习惯,只有这样才能避免过高的学习和适应成本,给用户带来 “熟悉感”,从而让用户获得更好的使用体验
软件界面设计的好坏通常不仅仅是美观与否的问题,一个精良的设计往往能让应用程序本身变得更加高效和易于使用,相反,一个糟糕的设计则完全可能让开发者在应用上的其他努力付诸东流
因此,在现代应用程序的开发过程中,用户界面设计所占的地位越来越重要。对于开发者来说,用户界面设计并不仅仅是图像或美学设计,而是应用一系列简单而实用的准则或策略来改善软件易用性的一个步骤
目标用户群体
为了帮助用户更好地在对一个新的软件产品做需求分析和功能设计之前,必须要明确软件所针对的用户群体,以及用户群的具体特征,只有这样才能设计并开发出对用户有价值的功能
用户本身的技能、个性、性别、年龄、所受教育以及文化背景上的差异,用户的基础计算机操作水平,用户在相关领域的专业知识,都可能导致用户对界面的需求的不同
用户界面作为应用程序和用户交互的核心途径,必须将不同用户对界面的不同需求考虑在其中,这样才能给用户提供最好的使用体验。否则,即使软件内部的功能十分强大,如果界面使用起来体验非常糟糕,用户也不会选择使用它
简洁与清晰
在界面设计中,应当仔细斟酌每个界面元素的作用、重要性和交互方式,将重要的界面元素放置在显著位置,不太重要的界面元素则降级到相对次要的位置,并凸显界面元素之间的层次感和逻辑感,避免对空间进行罗列和堆叠
此外,对于展示实际用户内容的界面,不应使得软件工具栏和其他辅助控件过多地占用用户实际内容的屏幕空间,或干扰用户正常浏览应用所展示的内容
实现模型与心智模型
从程序开发人员的角度出发,开发一个应用程序所需要用到的技术解决方案,称之为这个程序的实现模型
例如:在开发一个在线的物品交易平台时,使用 Python 作为后端语言,HTML、CSS、JavaScript 等作为前端语言,MySQL 作为数据库引擎,这些都属于实现模型
实现模型往往包含了复杂艰深的理论、技术、算法等内容,这些内容在开发过程中对开发者来说是至关重要的,但是却不会被大多数用户所了解
与实现模型不同,软件的真实用户对该软件用法和运作方式的个人理解,则称之为心智模型,心智模型有助于用户理解自己使用软件的过程,预测某个操作的结果,并应对出乎意料的情况
设计的规范性
大多数主流操作系统都有一套专门的设计规范,以供开发者和程序设计人员参考
例如:对于 macOS,苹果公司发布过官方的人机界面指南,其完整版本在苹果开发者网站即可找到
应用程序的开发者和设计人员在设计一个应用程序时,应当通读、理解并严格遵守相关设计指南中的设计要求
设计的可用性和易用性
在设计和开发中,可用性是衡量一个应用程序用户体验好坏的重要标准之一
具有良好的可用性,要求应用具有:容易学习掌握、高效、令人愉悦这 3 个特性
没人喜欢使用复杂、晦涩、难以掌握的应用程序,为获得良好的可用性,在设计和开发的每个步骤和每一轮迭代中,开发人员都应该将软件的目标用户作为核心,在实际使用环境中,以真实用户的需求、偏好和习惯为导向,对产品的设计进行不断优化
设计的一致性
在界面以及交互设计中,追求一致性是非常重要的,它允许用户将先前已经建立的使用习惯和知识带入到一个全新的应用程序中
根据一致性的范围,可将其大致分为两类:
- 外部一致性:每个操作系统都有其固有的操作模式及标准的用户界面元素,一个设计良好的应用应当遵循这些惯例
- 内部一致性:在一个应用内部应该保持统一,不应产生歧义或自相矛盾
此外,在界面的样式设计上,一个应用也应当具有一个统一的风格,包括颜色搭配和使用、控件样式,字体、动画、阴影等各种设计元素的运用
设计的容错性
良好的容错性允许用户大胆地探索一个应用程序的所有功能,因为绝大部分操作都是可逆的、非破坏性的
如果用户确信他们可以大胆地尝试每个按钮的用途而不用担心他们的操作系统或数据被损坏,应用程序的用户体验会大大提高
此外,良好的容错性也会让应用程序显得更加稳定、可靠,如果用户发现在一个应用程序中并不会因为无意中的操作就造成严重错误,他们自然会更加信任这一应用程序