计算机软考程序员:软件设计规范

计算机软考程序员:软件设计规范,第1张

计算机软考程序员:软件设计规范,第2张

概述
软件设计是将需求转化为软件系统的最重要环节,软件系统的质量从根本上决定于系统设计的质量。
这里主要阐述了软件系统设计的五个核心内容:架构设计、用户界面设计、数据库设计、模块设计、数据结构和算法设计。旨在帮助开发者弄清楚“设计什么”和“如何设计”。
一般来说,设计过程分为两个阶段:概要设计阶段和详细设计阶段,如下图:
概要设计阶段侧重于架构设计。
详细设计阶段重点是用户界面设计、数据库设计、模块设计、数据结构和算法设计等。
可以根据项目情况进行文档缩减和流程合并。例如,项目开发过程只有一个设计阶段和设计文档。
建筑
建筑就像人的骨架。如果一个家伙的骨架是一只猴子,那么无论他怎么喂养和打扮,这个家伙永远是一只猴子,不会变成人。
可见体系架构是系统设计中最重要的。
目前业界流行的软件结构模型有C/S(客户端/服务器)、B/S(浏览/服务器)、层次结构(上下级层次结构、相邻顺序层次结构、中间件层次结构)
架构设计原则
●适用性
即架构。一个高水平的设计师的志向是“设计出刚好满足客户需求的软件,让开发者和客户都获得收益,而不是不惜任何代价设计出最先进的软件。”
●结构稳定性
详细设计阶段的工作,如用户界面设计、数据库设计、模块设计、数据结构和算法设计等。,是在架构确定之后进行的,而编程和测试是后期的工作,所以架构要在一定时间内保持稳定。
软件开发最怕的就是需求变化,但“需求会变化”是无法逃避的现实。人们希望当需求发生变化时,只对软件做一些修改,而从不改变软件架构。如果程序员不得不在需求变化时修改软件架构,那么这个软件的系统设计就会失败。
高层次的设计人员应该能够分析需求文档,并确定哪些需求是稳定的,哪些需求可能会发生变化。所以架构是根据那些稳定的需求来设计的,软件的“扩展性”是根据那些可变的需求来设计的。
●可伸缩性
可伸缩性是指软件扩展新功能的难易程度。扩展性越好,软件适应“变化”的能力就越强。
可扩展性越来越重要,这是现代软件的商业模式决定的:
社会上的业务越发达,需求变化越快。需求的变化必然导致软件功能的修改(或扩展)。现代软件的规模和复杂程度都比十年前大了很多(对比一下操作系统的变化就知道了)。如果软件的可扩展性很差,修改(或扩展)功能的成本会很高。
现代软件产品通常采用“增量开发模式”,开发者不断推出新版本的软件产品,从而不断获取增值利润。如果软件的可扩展性差,每次开发一个新版本的成本会很高。开发商虽然抓住了商机,但由于设计水平差,并没有赚到多少利润,真是让他们活活气死。
●可重用性
根据经验,通常在一个新的系统中,大部分内容是成熟的,只有少部分内容是创新的。一般认为成熟的东西总是可靠的(即质量高),而大量成熟的工作可以通过重用快速实现(即生产率高)。
可重用性是设计出来的,而不是偶然的。为了使体系结构可重用,设计人员应该分析应用领域的常见问题,然后设计一个通用的体系结构模式,以便体系结构可以重用。
用户界面设计
为了提高用户界面的可用性和美观性,总结了十条设计原则。提高可用性的界面设计原则有八条:
用户界面适合软件功能
易于理解
风格一致
及时反馈信息
错误处理
适应各种用户
国际化
个性化[ Br/]布局合理
色彩和谐
●用户界面适合软件功能
用户界面的恰当性是指界面与软件功能的和谐程度。软件的功能需要通过用户界面来展现,用户界面必须适合软件的功能,这是最基本的要求。界面的恰当性不仅提倡外在美和内在美,而且强调恰当。
●易于理解
提高用户界面可理解性的一些规则如下:
界面中的所有元素(如菜单、工具栏等。)都是无错的,不会被误解。
所有的界面元素都应该提供充分和必要的提示。例如,当鼠标移动到工具栏上的图标按钮时,图标旁边会出现一个功能提示。
界面结构能够清晰的反映工作流程,让用户一步一步的操作。
对于复杂的用户界面,提供界面“向导”,让用户及时了解自己在界面结构中的位置。例如,对于基于网络的应用软件,“当前位置”应该显示在界面上,否则用户很容易在众多的页面中迷失方向。
●风格一致
风格一致有两层含义:
(1)在一个软件用户界面中,同类界面元素应该具有相同的视觉感和相同的操作方式。例如,命令按钮是最常见的界面元素,所有命令按钮都具有相同的形状、颜色和对鼠标的响应。
(2)同类型软件的用户界面要有一定程度的相似性。比如微软的Office家族就有Word、Excel、PowerPoint、Outlook等软件。,以及这些软件提供的“复制、剪切和粘贴”功能都是以同样的方式操作的。
●及时反馈信息
用户执行一项操作后,如果过一会儿(几秒钟)用户界面完全没有反应,会让用户感到困惑和不安,因为他不知道是自己的操作错了还是软件导致了崩溃。所以及时反馈信息很重要,至少要让用户知道任务是怎么处理的,有什么样的结果。
比如下载一个文件,界面上要显示“百分比”或者相关的数字来表示下载的进度,否则人们就不知道要等多久了。如果有些事务无法提供进度等数据,至少给出“正在处理,请稍候……”之类的提示信息,就是提供适当的动画,让用户知道软件正在工作,没有崩溃。
●错误处理
在设计用户界面的时候一定要考虑到错误处理,让用户不必害怕,小心翼翼的避免出错。常用的错误处理方法:
提供检查输入数据的功能。当用户输入错误数据时,提醒用户及时更正数据。
对于某些情况下不应该使用的菜单项和命令按钮,“禁用”(屏蔽)可以有效防止该功能被错误使用。比如对于一些管理软件,不同的用户有不同的操作权限。如果具有低权限的用户登录到系统,那些只有具有高权限的用户可以使用的功能应该被阻止(例如,变成“灰色”并且不可操作)。
撤销功能用于撤销意外操作。
在执行破坏性操作之前,应该得到用户的确认。比如用户删除一个文件,应该会弹出一个对话框:“确定要删除这个文件吗?”,文件只有在用户确认后才会被删除。
●布局合理
首先,界面的布局要符合逻辑,与工作流程一致。只有仔细分析软件需求,界面设计者才能为界面布局提取有价值的信息。
其次,界面的布局要整齐(整洁清新)。元素应该水平或垂直对齐,行和列之间的间距应该一致。表格的大小要合适,各种控件不能过于拥挤,也不能过于宽松。充分利用表单和控件的空白色,以及用于分段的线条。
●和谐的色彩
用户界面是否美观主要取决于界面的布局和色彩搭配。实现“布局合理”相对容易,但设计出和谐的色彩就太难了,因为色彩的组合千变万化,人们对色彩的喜好也千差万别。
对于广大软件开发人员来说,虽然我们没有必要把常用软件的界面做得像Windows XP一样漂亮,但是掌握一些界面色彩的设计原则无疑是非常有益的。
如果不是为了显示逼真的图形和图像,一个屏幕的颜色数量应该是有限的,因为人们在观察屏幕时很难同时记住多种颜色。
颜色要根据对象的重要性来选择,重要的对象要用醒目的颜色来表现。
颜色应该一致。比如错误信息用红色显示,正常信息用绿色显示,不要用红绿。
在表达信息时,不要过分依赖颜色,因为有些用户是色盲或色弱。数据库设计
●开发平台无关的数据库应用程序
目前世界上应用最广泛的数据库系统是Oracle、DB2、Informix、Sybase和SQL Server。
这些数据库系统之间的激烈竞争有利有弊。竞争的好处是保持数据库系统的发展和完善,避免价格垄断。竞争的劣势在于,数据库厂商被迫不断开发独特的功能来吸引更多的用户,因此各种数据库系统的独特功能无法形成统一的标准,导致用户很难开发出平台无关的数据库应用,因为用户很难抵制数据库系统独特功能的诱惑。
读者可能会问,“结构化查询语言(SQL)不是数据库系统的标准吗?”
是的,SQL是数据库系统的标准查询语言。但是数据库厂商提供了太多SQL标准之外的特殊功能,这让人们陷入了两难的境地:
如果想让程序独立于数据库平台,只能使用SQL,放弃各个数据库系统特有的功能。
如果你超越SQL,使用数据库系统的独特功能,那么这样的程序就是平台相关的。
类似的问题也存在于操作系统和网页浏览器领域。理论上只有绝对垄断才能形成绝对统一的标准,但人们希望打破垄断,有一个统一的标准。这个矛盾无法彻底解决,他们只能妥协,妥协。建议如下:
如果你在开发通用的数据库应用软件,不希望应用软件捆绑特定的数据库系统,那么你就老老实实用SQL语言写程序吧。
如果你正在开发一个行业专用的数据库应用软件,并且行业指定了一个数据库系统(这种地方垄断现象普遍存在),而且近几年也不会改变,那么你就可以使用SQL之外的数据库系统特有的功能。
●数据库性能优化
数据库设计的主要挑战是“大容量数据的高速处理”。如何优化数据库的性能是设计人员经常面临的问题。优化数据库性能主要有两种方法:
优化表结构本身。比如对第三范式的表结构进行反规范化,允许表中有冗余数据,从而减少多个表的链接操作,达到提高性能的目的。
优化数据库的环境参数。比如改善硬件设施,调整table 空尽量减少数据碎片等。
在表格的物理设计阶段,设计者要按照第三范式(即标准化处理)来设计表格结构。这样做的好处是,表格中没有冗余数据,表格结构非常清晰,以后修改或扩展非常方便。但是,按照第三范式的设计也有一些缺点:产生了很多表,每个表的列数相对较少,而且这些列必须通过“主键/外键”来关联,因此某个查询操作可能会产生复杂的表链接,导致性能下降。
去规范化是指对第三范式的表进行修改,通过合并一些表或者在表中创建冗余列,从而降低表链接操作的代价,达到提升性能的目的。需要注意的是,反规范化有很大的负面影响:管理冗余数据非常麻烦,如果冗余数据不同步,就会出现数据错误的严重问题。
所以第三范式中规范化表是第一位的,而反规范化要慎重考虑,不宜过多使用。“规范化”和“反规范化”并不矛盾,而是性能优化的策略。
除了优化表结构,优化数据库的环境参数也可以提高数据库的性能。例如,为服务器配置更快的CPU并增加内存。运行一个数据库要消耗大量内存,内存对数据库的性能影响很大。随着市面上的内存芯片越来越便宜,为服务器配置足够的内存大概是成本最低,难度最低,见效最快的性能优化方法。
安装数据库系统时,为系统指定“块大小”(为物理读写操作设计的字节数)。创建表时,还应该为表指定某个空间隔。如果“块大小”和“表间空”与实际数据存储不匹配,就会产生大量磁盘碎片,降低数据库物理操作的性能。
应用软件数据库的性能能否得到有效优化,主要取决于开发者对数据库系统的熟悉程度和开发经验。
●数据库安全问题
提高软件系统的安全性,要从“管理”和“技术”两方面入手。这里只考虑技术手段(因为安全管理超出了软件工程的范畴),大体原理如下:
用户只能用自己的账号登录应用软件,通过应用软件访问数据库,除此之外没有其他方法操作数据库。
加密用户账号的密码,保证密码的明文不会出现在任何地方。
确定每个角色对数据库表的操作权限,如新建、检索、更新、删除等。每个角色都有完成任务的权利,不多不少。在应用程序中为用户分配角色时,每个用户的权限等于其角色权限的总和。
模块设计
软件架构设计完成后,从宏观上明确了每个模块应该具备的功能,以及在架构中的位置。我们习惯按功能划分模块,保持“功能独立”是模块化设计的基本原则。因为“功能独立”的模块可以降低开发、测试、维护等阶段的成本。但是“功能独立”并不意味着模块保持绝对隔离。一个系统要完成某项任务,需要各个模块的配合。这时候就需要模块之间进行信息交换了。
评价模块设计质量的三个特征因素:“信息隐藏”、“内聚耦合”、“封闭-开放”。
●信息隐藏
为了尽可能避免一个模块干扰同一系统中其他模块的行为,在设计模块时要注意信息隐藏。该模块应该只公开必须为外界所知的内容,而隐藏其他所有内容。
模块的信息隐藏可以通过界面设计来实现。它是模块的外部特征,应该公开;数据结构、算法、实现者等。是模块的内部功能,应该隐藏。一个模块只提供有限数量的接口,需要且仅需要调用公共接口来执行模块的功能或与模块交换信息。如果模块是C++对象,那么模块的公共接口对应于对象的公共函数。如果模块是COM对象,那么模块的公共接口就是COM对象的接口。一个COM对象可以有多个接口,每个接口本质上都是函数的集合。
●高内聚
内聚是模块中组件之间相关程度的度量。内聚度从低到高大致可分为低端、中端和高端,如图3-15所示。模块设计者没有必要确定确切的内聚级别。重要的是争取高凝聚力,避免低凝聚力。
顺序衔接功能衔接
顺序衔接程序衔接交际衔接
偶然性衔接逻辑衔接
低端…中端…高端…
各类衔接的含义如下:
偶然性衔接。如果一个模块的组件之间的关系是松散的(几乎不相关),则称为偶然内聚。
逻辑衔接。几个逻辑上相关的功能放在同一个模块里,叫做逻辑内聚。例如,一个模块读取各种类型的外设的输入。
顺序衔接。如果一个模块中的几个功能必须同时执行(如系统初始化),但这些功能只是因为时间而相关,则称之为时态内聚。
流程衔接。如果一个模块中的处理组件是相关的,并且这些过程必须按照特定的顺序执行,这就叫做过程内聚。
沟通凝聚力。如果一个模块的所有组件都操作或生成相同的数据集,则称为通信内聚。
顺序衔接。如果一个模块中一个组件的输出被用作另一个组件的输入,则称之为顺序内聚。
功能衔接。一个模块的所有组件都是完成一个单一功能所必需的,这就是所谓的功能内聚。
●低耦合
耦合是衡量模块之间依赖程度的一个指标。和内聚耦合密切相关。一个模块与其他模块强耦合通常意味着弱内聚,一个模块强内聚通常意味着与其他模块弱耦合。
耦合的强度取决于以下因素:(1)一个模块对另一个模块进行函数调用的次数;(2)从一个模块传输到另一个模块的数据量;(3)一个模块对另一个模块施加多大的控制;(4)模块间接口的复杂性。
耦合度从低到高大致可分为低端、中端和高端,如图3-16所示。模块设计应力求“高内聚、低耦合”,避免“低内聚、高耦合”。
印记耦合控制耦合
公共耦合内容耦合
间接耦合数据耦合
低端…中端…高端…
各种耦合类型的含义如下:
间接耦合。模块之间没有直接的信息传递,称为间接耦合。
数据耦合。模块之间通过接口传递参数(数据),称为数据耦合。
标记耦合。模块通过接口传递内部数据结构的一部分(而不是简单的参数),这叫做Stamp耦合。这个数据结构的改变会改变相关的模块。
控制耦合。该模块传输信号(如开关量、标记量等。)到另一个模块,接收信号的模块根据信号值调整自己的动作,这叫控制耦合。
公共耦合。两个以上的模块一起引用一个全局数据项,称为公共耦合。
内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接传输到另一个模块时,就会发生内容耦合。
数据结构和算法的设计
设计高效的程序是基于良好的数据结构和算法,而不是编程技巧。
一般来说,数据结构和算法是一种数据及其相关运算的表示(这里的算法不是指数值计算的算法)。从数据表示的角度来看,存储在数组中的有序整数表也是一种数据结构。算法指的是强加在数据结构上的一些操作,比如搜索、插入和删除线性表。如果一个算法能够在要求的资源约束内解决问题,那么它就是有效的。例如,资源约束可能是“用于存储数据的有限内存”或“执行每个子任务所需的有限时间”。如果一个算法比其他已知算法需要的资源少,这个算法也叫高效。算法的成本是指消耗的资源量。一般来说,成本是由时间或空等关键资源来评估的。
毫无疑问,人们写程序是为了解决问题。只有提前分析问题,确定必须达到的性能目标,才有希望选择正确的数据结构。相当一部分程序员忽略了这个分析过程,直接选择了一个自己习惯的,但与问题不相称的数据结构。结果,他们设计了一个低效的程序。如果使用简单的设计就能达到性能目标,那么选择复杂的数据结构是不合理的。
人们对常用的数据结构和算法研究得相当透彻,可以总结出一些设计原则:
1)每种数据结构和算法都有自己的时间,空开销和收益。当面对一个新的设计问题时,设计者应该彻底掌握如何权衡时间空代价和算法有效性的方法。这需要了解算法分析的原理,以及所使用的物理介质的特性(例如,当数据存储在磁盘或内存中时,有不同的考虑事项)。
2)费用和收益与时间-空之间的权衡有关。通常你可以用更多的时间换取空之间的利润,反之亦然。时间-空之间的权衡存在于软件开发的所有阶段。
3)设计师要充分了解一些常用的数据结构和算法,避免不必要的重复设计工作。
4)数据结构和算法是为应用服务的。我们首先要了解应用的需求,然后找到或者设计出与实际应用相匹配的数据结构。
数据结构和算法设计的一般流程如下:
(1)数据结构和算法可以分为全局和局部,当然是先设计全局的,再设计局部的(一般在模块设计的时候)。
(2)根据问题的特点,先查阅现有的数据结构和算法,选择最适合的(不一定是最先进的)。如果没有现成的,那就自己设计。
(3)设计写好代码后,进行测试。如果达不到性能要求,就要进一步优化数据结构和算法。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机软考程序员:软件设计规范

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情