软件设计是一个过程,通过这个过程,一个代理创建一个软件工件的规范,目的是实现目标,利用一组原始组件并受到约束。
[1]软件设计可以指“所有涉及观点化、框架化、实现、调试的活动,终极修正繁芜系统“或”遵照需求规范和编程之前的活动,如。


一个程式化的软件工程过程

软件设计常日涉及办理问题和方案软件办理方案。
这包括底层组件和算法设计以及高层架构设计。

jsp程序设计的概括软件工程软件设计概述 GraphQL

概述

软件设计是为一组或多组问题设想和定义软件办理方案的过程。
软件设计的紧张组成部分之一是软件需求剖析(SRA)。
SRA是软件开拓过程的一部分,它列出了软件工程中利用的规范。
如果软件是“半自动化”或以用户为中央的,软件设计可能会涉及到用户体验设计,从而产生一个故事板来帮助确定这些规范。
如果软件是完备自动化的(意味着没有用户或用户界面),那么软件设计可以像描述操持的事宜序列的流程图或文本一样大略。
还有一些半标准的方法,犹如一建模措辞和基本建模观点。
在这两种情形下,操持的某些文档常日是设计的产物。
此外,软件设计可以独立于平台或特定于平台,这取决于用于设计的技能的可用性。

软件剖析和设计的紧张差异在于,软件剖析的输出包含要办理的较小问题。
此外,在不同的团队成员或小组中,剖析的设计不应该有很大的不同。
比较之下,设计的重点是能力,因此同一问题的多个设计可以也将存在。
根据环境的不同,设计常日会有所不同,无论是从可靠的框架创建的,还是利用得当的设计模式实现的。
设计实例包括操作系统、网页、移动设备乃至新的云打算模式。

软件设计既是一个过程又是一个模型。
设计过程是一系列的步骤,使设计者能够描述软件的各个方面。
创造性的技能,过去的履历,对“好”软件的理解,以及对质量的全面承诺,都是成功设计的关键成分。
然而,须要把稳的是,设计过程并不总是一个大略的过程;设计模型可以与建筑师的房屋方案比较较。
它首先表现出要建造的东西的整体性(例如,屋子的三维效果图);逐步地,这个东西被提炼出来,为建造每个细节(例如,管道铺设)供应辅导。
同样,为软件创建的设计模型供应了打算机软件的各种不同视图。
基本设计原则使软件工程师能够在设计过程中导航。
Davis[3]提出了一套软件设计原则,这些原则不才面的列表中进行了修正和扩展:

设计过程不应该受到“隧道视觉”的影响。
一个好的设计师该当考虑其他的方法,根据问题的需求、可用的资源来判断每一种方法。
设计应可追溯到剖析模型。
由于设计模型的单个元素常日可以追溯到多个需求,因此有必要有一种方法来跟踪设计模型如何知足需求。
这个设计不应该重新发明轮子。
系统是利用一组设计模式构建的,个中许多模式以前可能碰着过。
应始终选择这些模式作为重新改造的替代方案。
韶光很短,资源有限;设计韶光该当投资于通过集成已经存在的模式(如果适用)来表示(真正的新)思想。
设计该当“最小化软件和现实天下中存在的问题之间的智能间隔”。
也便是说,软件设计的构造该当尽可能地模拟问题域的构造。
设计应表现出同等性和集成性。
如果设计看起来完备同等,那么它便是同等的。
为了达到这个结果,在设计事情开始之前,该当为设计团队定义样式和格式规则。
如果在定义设计组件之间的接口时小心,则设计是集成的。
设计的构造应适应变革。
下一节谈论的设计观点使设计能够实现这一原则。
纵然碰着非常的数据、事宜或操作条件,设计也该当被布局成温和的降级。
精心设计的软件不应该“爆炸”;它该当被设计成适应不屈常的情形,如果它必须终止处理,它该当以一种优雅的办法这样做。
设计不是编码,编码不是设计。
纵然为程序组件创建了详细的过程设计,设计模型的抽象级别也高于源代码
在编码级别做出的唯一设计决策该当处理使过程设计能够被编码的小的实现细节。
设计该当在被创建时进行质量评估,而不是事后评估。
在全体开拓过程中,可以利用各种设计观点和设计方法来帮助设计师评估质量。
应审查设计,以只管即便减少观点(语义)缺点。
在审查设计时,有时会方向于看重细节,而忽略了森林中的树木。
设计团队应确保在担心设计模型的语法之前,已经办理了设计的紧张观点元素(遗漏、歧义、不一致)。

设计观点

设计观点为软件设计者供应了一个可以运用更繁芜方法的根本。
一套基本的设计观点已经形成。
详细如下:

抽象-抽象是通过减少观点或可不雅观察征象的信息内容来概括的过程或结果,常日是为了只保留与特定目的干系的信息。
它是一种表示基本特色的行为,不包括背景细节或阐明。
精化——这是精化的过程。
层次构造是通过逐步分解函数的宏不雅观语句来开拓的,直到达到编程措辞语句为止。
在每个步骤中,给定程序的一个或多个指令被分解为更详细的指令。
抽象和精化是相辅相成的观点。
模块化-软件架构被划分为称为模块的组件。
软件架构-它指的是软件的总体构造,以及该构造为系统供应观点完全性的办法。
良好的软件架构将在项目的预期结果方面产生良好的投资回报,例如在性能、质量、进度和本钱方面。
掌握层次构造-表示程序组件的组织构造并表示掌握层次构造的程序构造。
构造划分-程序构造可以分为水平和垂直两种。
水平分区为每个紧张程序功能定义模块层次构造的独立分支。
垂直分区建议掌握和事情该当在程序构造中自上而下分布。
数据构造-它是数据的各个元素之间逻辑关系的表示。
软件过程-它专注于每个模块的单独处理。
信息隐蔽-应指定和设计模块,以便模块中包含的信息对不须要此类信息的其他模块不可访问。

在他的工具模型中,Grady Booch提到抽象、封装、模块化和层次构造是软件设计的基本原则。
[4]缩写PHAME(层次构造、抽象、模块化和封装的原则)有时被用来指代这四个基本原则。
[5]

设计把稳事变

在一个软件的设计中有许多方面须要考虑。
每一个考虑成分的主要性都该当反响出软件所要达到的目标和期望。
个中一些方面是:

兼容性-该软件能够与其他产品一起运行,这些产品是为与其他产品的互操作性而设计的。
例如,一个软件可能与它自己的旧版本向后兼容。
可扩展性-新功能可以添加到软件中,而无需对底层架构进行重大变动。
模块化-天生的软件由定义良好的独立组件组成,从而提高了可掩护性。
然后,这些组件可以在集成成所需的软件系统之前单独实现和测试。
这许可在软件开拓项目中进行分工。
容错-软件能够抵抗并从组件故障中规复。
可掩护性-一个衡量bug修复或功能修正的随意马虎程度的指标。
高可掩护性是模块化和可扩展性的产物。
可靠性(软件耐久性)-软件能够在规定的条件下在规定的韶光内实行所需的功能。
可重用性-在其他项目中利用现有软件的某些或所有方面而不做任何修正的能力。
稳健性-软件能够在压力下运行,或容忍不可预测或无效的输入。
例如,它可以被设计成具有对低内存条件的弹性。
安全性-该软件能够抵御和抵抗敌对行为和影响。
可用性-软件用户界面必须对其目标用户/受众可用。
必须选择参数的默认值,以便大多数用户都能很好地选择这些值。
[6]性能-软件在用户可以接管的韶光范围内实行任务,并且不须要太多内存。
可移植性-软件该当可以在许多不同的条件和环境下利用。
可扩展性-软件很好地适应了不断增长的数据或用户数量。
建模措辞

建模措辞是一种人工措辞,可以用来表达由一组同等的规则定义的构造中的信息、知识或系统。
这些规则用于阐明构造中的组件。
建模措辞可以是图形措辞或文本措辞。
软件设计的图形建模措辞示例如下:

体系构造描述措辞(ADL)是描述和表示软件系统体系构造的措辞。
业务流程建模符号(BPMN)是流程建模措辞的一个例子。
EXPRESS和EXPRESS-G(ISO 10303-11)是一种国际标准通用数据建模措辞。
扩展企业建模措辞(EEML)常日用于跨多个层的业务流程建模。
流程图是算法或其他逐步过程的示意图。
根本建模观点(FMC)是软件密集型系统的建模措辞。
IDEF是一个建模措辞家族,个中最著名的包括用于功能建模的IDEF0、用于信息建模的IDEF1X和用于本体建模的IDEF5。
Jackson构造化编程(JSP)是一种基于数据流构造和程序构造之间的对应关系的构造化编程方法。
LeMP3是面向工具的可视化设计描述措辞,是一种形式化的规范措辞,紧张适用于大型面向工具(java,C++,C措辞)程序和设计模式的建模。
统一建模措辞(UML)是一种从构造和行为上描述软件的通用建模措辞。
它有一个图形符号,许可利用概要文件(UML)进行扩展。
Alloy(specification language)是一种通用的规范措辞,用于表达软件系统中繁芜的构造约束和行为。
它供应了一种基于一阶关系逻辑的简明措辞。
系统建模措辞(SysML)是一种新的系统工程通用建模措辞。
面向做事的建模框架(SOMF)[7]设计模式

软件设计师或架构师可能会创造一个设计问题,这个问题过去曾被其他人访问过,乃至可能被其他人办理过。
描述常见问题办理方案的模板或模式称为设计模式。
这种模式的重用有助于加快软件开拓过程

技能

在软件中利用“设计”一词的困难在于,在某种意义上,程序的源代码便是它所天生的程序的设计。
在一定程度上,这是真的,“软件设计”是指设计的设计。
Edsger W.Dijkstra将这种语义层次的分层称为打算机编程的“根本新奇之处”[9],Donald Knuth用他编写TeX的履历来描述在实现之前试图设计程序的徒劳:

如果我仅仅指定了TEX,而没有完备参与它的初始实现,它将是一个彻底的失落败。
履行过程不断地让我产生意想不到的问题,并对如何改进原始规范有了新的见地

用法

软件设计文档可以在打算机编程之提高行审查或呈现,以许可对约束、规范乃至需求进行调度。
重新设计可能发生在程序仿照或原型审查之后。
可以在编程过程中设计软件,而无需进行操持或需求剖析,[11],但对付更繁芜的项目,这将被认为是不可行的。
编程前的独立设计许可多学科设计师和主题专家(SME)与高技能程序员协作,开拓既有用又技能可靠的软件。

干系话题

Wikimedia Commons has media related to Software design.

Aspect-oriented software developmentBachelor of Science in Information TechnologyDesign rationaleInteraction designIcon designSearch-based software engineeringSoftware Design Description (IEEE 1016)Software developmentUser experienceUser interface designZero One Infinity

原文:https://en.wikipedia.org/wiki/Software_design

本文:http://jiagoushi.pro/node/969

谈论:请加入知识星球或者微信圈子【首席架构师圈】