软件设计
软件设计是代理商使用一组原始组件并受到约束的方式,通过代理创建旨在实现目标的软件工件的规范。该术语有时广泛地用于“概念化,框架,实施,调试,并最终修改“软件,或更具体地说是”以下内容按要求规范和编程之前的活动,为... [IN]风格化的软件工程过程。”
软件设计通常涉及解决问题和计划软件解决方案。这包括低级组件和算法设计以及高级建筑设计。
概述
软件设计是将软件解决方案设想和定义一组问题的过程。软件设计的主要组成部分之一是软件需求分析(SRA)。 SRA是软件开发过程的一部分,该过程列出了软件工程中使用的规格。
如果软件是“半自动化”或以用户为中心的,则软件设计可能涉及用户体验设计,该设计产生故事板以帮助确定这些规格。如果软件是完全自动化的(意味着没有用户或用户界面),则软件设计可能与描述计划的事件序列的流程图或文本一样简单。还有半标准的方法,例如统一建模语言和基本建模概念。无论哪种情况,该计划的某些文档通常都是设计的乘积。此外,根据设计用于设计的技术的可用性,软件设计可能与平台无关或特定于平台。
软件分析和设计之间的主要区别在于,软件分析的输出包括要解决的较小问题。此外,分析的设计不应在不同的团队成员或小组中的设计差异很大。相比之下,该设计着重于功能,因此可以并且将存在多个针对同一问题的设计。根据环境的不同,无论是由可靠的框架创建还是使用合适的设计模式实现,设计通常会有所不同。设计示例包括操作系统,网页,移动设备,甚至是新的云计算范式。
软件设计既是过程又是模型。设计过程是一系列步骤,使设计人员能够描述用于构建软件的所有方面。创造性技能,过去的经验,对“良好”软件的理解以及对质量的总体承诺是合格设计的关键成功因素的例子。但是,设计过程并不总是一个直接的过程。可以将设计模型与建筑师的房屋计划进行比较。它首先要代表要建造的东西的整体(例如,房屋的三维渲染)。慢慢地,完善的是为构建每个细节的指导(例如,管道层)。同样,为软件创建的设计模型提供了计算机软件的各种不同视图。基本设计原理使软件工程师能够浏览设计过程。戴维斯(Davis)提出了一套软件设计原则,这些原则已在以下列表中进行了调整和扩展:
- 设计过程不应遭受“隧道视觉”的困扰。一个好的设计师应考虑替代方法,根据问题的要求,可用于完成这项工作的资源来判断每种方法。
- 该设计应可追溯到分析模型。由于设计模型的单个元素通常可以追溯到多个要求,因此有必要有一种方法来跟踪设计模型如何满足需求。
- 设计不应重新发明轮子。系统是使用一组设计模式构建的,其中许多可能以前遇到过。这些模式应始终选择作为重新发明的替代方法。时间很短,资源有限;设计时间应通过整合已经存在的模式(如果适用)来代表(真正的新)想法。
- 设计应“最小化软件与问题之间存在的问题之间的智力距离”。也就是说,软件设计的结构应尽可能模仿问题域的结构。
- 设计应表现出统一性和整合。如果设计看起来完全连贯,则是均匀的。为了实现这一结果,在设计工作开始之前,应为设计团队定义样式和格式规则。如果在定义设计组件之间的界面时要注意注意,则将整合设计。
- 该设计应结构化以适应变化。下一节讨论的设计概念使设计能够实现这一原则。
- 即使遇到异常的数据,事件或操作条件,也应将设计构建以轻轻降解。精心设计的软件绝不应该“炸弹”;它应该旨在适应异常情况,如果必须终止处理,则应以优雅的方式进行处理。
- 设计不是编码,编码不是设计。即使为程序组件创建了详细的程序设计,设计模型的抽像水平也高于源代码。在编码级别上做出的唯一设计决策应该解决可以编码程序设计的小型实施细节。
- 应该评估设计时的质量,而不是事实之后。可以使用各种设计概念和设计措施来帮助设计师在整个开发过程中评估质量。
- 应该审查该设计以最大程度地减少概念(语义)错误。有时会在审查设计时倾向于专注于细节,而缺少树木的森林。设计团队应确保在担心设计模型的语法之前已经解决了设计的主要概念元素(遗漏,歧义,矛盾之处)。
设计概念
该设计概念为软件设计师提供了一个基础,可以从中应用更复杂的方法。一组基本的设计概念已经发展。它们如下:
- 抽象- 抽像是通过减少概念或可观察现象的信息内容或可观察到的现象的过程或结果,通常是为了保留与特定目的相关的信息。这是代表基本功能的行为,而不包括背景细节或解释。
- 改进- 这是阐述的过程。通过以逐步的方式分解宏观功能语句,直到达到编程语言语句。在每个步骤中,将给定程序的一个或几个说明分解为更详细的说明。抽象和改进是互补的概念。
- 模块化- 软件体系结构分为称为模块的组件。
- 软件体系结构- 它是指软件的整体结构以及该结构为系统提供概念完整性的方式。良好的软件体系结构将在项目的预期结果(例如绩效,质量,时间表和成本方面)获得良好的投资回报。
- 控制层次结构 - 代表程序组件组织的程序结构,意味着控制的层次结构。
- 结构分区 - 程序结构可以水平和垂直分配。水平分区为每个主要程序函数定义模块化层次结构的单独分支。垂直分区表明,控制和工作应在程序结构中向下分配。
- 数据结构- 它是数据元素之间逻辑关系的表示。
- 软件过程 - 它重点介绍每个模块的处理。
- 信息隐藏- 应该指定和设计模块,以使模块中包含的信息无法访问其他不需要此类信息的模块。
在他的对像模型中, Grady Booch提到抽象,封装,模块化和层次结构是基本软件设计原理。首字母缩略词Phame(层次结构,抽象,模块化和封装的原则)有时用于参考这四个基本原理。
设计注意事项
一件软件的设计中需要考虑许多方面。每个考虑的重要性应反映出要满足软件的目标和期望。其中一些方面是:
- 兼容性 - 该软件能够与用于与另一种产品互操作的其他产品一起运行。例如,一块软件可能会与较旧版本的自身版本向后兼容。
- 可扩展性- 可以将新功能添加到软件中,而无需对基础体系结构进行重大更改。
- 模块化- 由此产生的软件包括定义良好的独立组件,可提高可维护性。然后可以孤立地实现和测试组件,然后集成以形成所需的软件系统。这允许在软件开发项目中进行工作。
- 容错- 该软件对组件故障的抵抗力并能够恢复。
- 可维护性- 可以实现错误修复或功能修改的方法。高可维护性可以是模块化和可扩展性的产物。
- 可靠性(软件耐用性) - 该软件能够在指定的时间段内执行所需的功能。
- 可重用性- 能够在其他项目中使用先前存在软件的某些或所有方面的能力,几乎没有修改。
- 鲁棒性- 该软件能够在压力下运行或忍受不可预测或无效的输入。例如,它可以对低记忆条件具有韧性设计。
- 安全性- 该软件能够承受和抵抗敌对行为和影响。
- 可用性- 软件用户界面必须适用于其目标用户/受众。必须选择参数的默认值,以便它们是大多数用户的理想选择。
- 性能- 该软件在用户可以接受的时间范围内执行其任务,并且不需要太多的内存。
- 可移植性- 该软件应在许多不同的条件和环境中可用。
- 可伸缩性- 该软件非常适合增加数据或添加功能或用户数量。
建模语言
建模语言是任何人造语言,可用于以一致的规则定义的结构中表达信息,知识或系统。这些规则用于解释结构内的组件。建模语言可以是图形的或文本的。软件设计的图形建模语言的示例是:
- 体系结构说明语言(ADL)是一种用于描述和表示软件系统的软件体系结构的语言。
- 业务流程建模符号(BPMN)是过程建模语言的一个示例。
- Express和Express-G(ISO 10303-11)是一种国际标准通用数据建模语言。
- 扩展的企业建模语言(EEML)通常用于跨多个层的业务过程建模。
- 流程图是算法或其他阶梯过程的示意图。
- 基本建模概念(FMC)是针对软件密集型系统的建模语言。
- IDEF是一个建模语言的家族,其中最著名的包括用于功能建模的IDEF0 ,用于信息建模的IDEF1X和用于建模本体的IDEF5 。
- 杰克逊结构化编程(JSP)是基于数据流结构和程序结构之间的对应关系进行结构化编程的方法。
- Lepus3是一种面向对象的视觉设计说明语言和一种正式的规范语言,主要用于建模大型面向对象( Java , C ++ , C# )程序和设计模式。
- 统一建模语言(UML)是一种通用建模语言,可在结构和行为上描述软件。它具有图形符号,并允许使用配置文件(UML)扩展。
- 合金(规范语言)是一种通用规范语言,用于在软件系统中表达复杂的结构约束和行为。它为一阶关系逻辑提供了简洁的语言基础。
- 系统建模语言(SYSML)是系统工程的一种新的通用建模语言。
- 面向服务的建模框架(SOMF)
设计模式
软件设计师或建筑师可能会发现一个设计问题,该问题过去曾经访问过,甚至可能由其他人解决。描述通用问题解决方案的模板或模式称为设计模式。这种模式的重复使用可以帮助加快软件开发过程。
技术
使用与软件有关的“设计”一词的困难在于,从某种意义上说,程序的源代码是其生成的程序的设计。在某种程度上,“软件设计”是指设计的设计。 Edsger W. Dijkstra将这种语义级别的分层称为计算机编程的“激进新颖性”,唐纳德·诺斯(Donald Knuth)使用他的经验写作Tex来描述在实施该程序之前尝试设计程序的徒劳无功:
如果我只是指定它并且没有完全参与其初始实施,那将是完全失败的。实施过程不断地使我提出了意外的问题,并就如何改善原始规范进行了新的见解。
用法
可以在计算机编程之前对软件设计文档进行审查或呈现,以允许在计算机编程之前进行限制,规格甚至要求。审查程序模拟或原型后可能会重新设计。在没有计划或要求分析的情况下,可以在编程过程中设计软件,但是对于更复杂的项目,这是不可行的。编程之前的单独设计允许多学科设计师和主题专家(SME)与高技能的程序员合作,以获取有用且在技术上合理的软件。