Logo

郎哥编程

软件设计知识

2016-02-09 23

1、软件设计目标

软件设计的目标是获取能够满足软件需求的、明确的、可行的、高质量的软件解决方案。

“明确”是指软件设计模型易于理解,软件构造者在设计方案的实现过程中,勿需再面对影响软件功能和质量的技术抉择或权衡。

“可行”是指,在可用的技术平台和软件项目的可用资源条件下,采用预定的程序设计语言可以完整地实现该设计模型。

“高质量”是指,设计模型不仅要给出功能需求的实现方案,而且要使该方案适应非功能需求的约束;设计模型要尽量优化,以确保依照设计模型构造出来的目标软件产品(在排除软件构造阶段引入的影响因素后)能够表现出良好的软件质量属性,尤其是正确性、有效性、可靠性和可修改性。

2、软件设计概念

软件设计是“定义一个系统或组件的架构、组件、接口和其他特征的逆程”,并得到“这个过程的结果M。作为过程看待时,软件设计是一种软件生命周期活动,在这个活动中,要分析软件需求,以产生一个软件内部结构的描述,并将其作为软件构造的基础。更精确地说,软件设计必须描述软件架构和这些组件之间的接口,也必须在详细的层次上描述组件,以便能构造这些组件。 
软件设计在软件开发中起着重要作用,通过它形成要实现的各种不同模型。分析和评价这些模型,以确定它们能否实现各种不同的需求,在各种不同的候选方案中进行权衡,确定最终方案。最后,将其作为构造和测试的输入和起始点,并用来规划后续的开发活动。 
软件设计由两个处于软件需求和软件构造之间的活动组成。 
    软件架构设计(有时叫做高层设计):描述软件的结构和组织,标识各种不同的组件。 
    软件详细设计:详细地描述各个组件,使之能被构造。 
软件架构是“一个描述软件系统的子系统和组件,以及它们之间相互关系的学科”。 
架构试图定义软件的内部结构。通过视图可以从不同角度描述软件结构,主要包括逻辑视图(满足功能需求)、过程视图(并发问题)、组件视图(实现问题)、部署视图(分布问题)。 
模式提供了架构设计的某些方法。模式是“给定上下文中普遍问题的普遍解决方案”,主要涉及设计模式(微观架构模式)和架构模式(宏观架构)。 

3、软件设计过程


软件的设计是一个将需求转变为软件陈述(表达)的过程。这种陈述给我们一个对软件的全局观点。

系统通过逐步求精使得设计陈述逐渐接近源代码。这里有两个基本步骤;

第一步是 初步设计 Preliminary design ,关注于如何将需求转换成数据和软件框架。

第二步是 详细设计 Detail design ,关注于将框架逐步求精细化为具体的数据结构和软件的算法表达。

发生中的设计行为、数据、算法和程序设计都需要由现代程序所需的界面设计这一清晰的行为来结合起来。

界面设计 Interface design 建立程序布局和人机交互机制。

贯穿设计过程的质量由一系列的 正式技术评定 formal technical reviews 或 设计排演 design walkthroughs 来评价。

良好的设计规范必须建立在对设计陈述(表达)的评估之上,以下是一些指导方针:

1. 设计应该展现层次结构使得软件各部分之间的控制更明智。 

2. 设计应当模块化;这就是说,软件应在逻辑上分割为实现特定的功能和子功能的部分。 

3. 设计应当由清晰且可分离的数据和过程表达来构成。 

4. 设计应使得模块展现独立的功能特性。 

5. 设计应使得界面能降低模块之间及其与外部环境的连接复杂性。 

6. 设计应源自于软件需求分析期间获得的信息所定之可重复方法的使用。

4、软件设计基础

软件设计方法论的这套基本原理已经经过了多年的进化。每种概念的影响程度不尽相同,但它们都经历了时间的洗礼。

基于这些基本原理设计者可以采用更多更成熟的设计方法。这些基本原理有助于设计者回答以下的问题: 

1. 将软件分割成独立的组件时会采用何种标准? 

2. 怎样将软件的原则性表示详细分割成函数或数据结构? 

3. 有没有定义一个软件设计的技术质量的统一标准?

M.A. Jackson 曾经说过: " 对一个计算机程序员来说,分辨让程序运行和让程序 正确 之间的差异是一个良好的开端。" 为了 " 使程序 正确 " ,基本设计原理提供了必须的框架。因此让我们来对这些基本原理作个简短的检视。 

(1)抽象 Abstraction

在最高层次上指的是使用待解决的问题领域内的术语描述的解决方案。相对较低层次的抽象则更多的面向程序语言,

最低层的抽象则是解决方案的可直接实现的方式描述。软件设计的每一个步骤都是对相应层次解决方案的抽象的逐步求精。 

(2)求精 Refinement

又叫做逐步求精指的是通过程序细节连续细化来开发程序体系的策略。

分步骤的对程序抽象进行分解直至成为编程语言的过程同时造就了程序的层次结构。在这一点上要对细节多做考虑,这也展示了求精实际上是个苦心经营的过程。 

(3)模块化 Modularity

指的是软件可被分割为分别命名并可寻址的组件(也叫做模块),将模块综合起来又可以满足问题的需求的性质。

" 软件的模块化是允许智能化管理程序的唯一属性。 " 换句话说,当您将一个复杂问题分解为一些小问题时会更容易解决。

需要重点解释的是即使一个系统必须象 " 单片机 " 一样来实现,它也可以采用模块化设计。 

(4)软件体系(架构) Software Architecture

涉及到程序的两个重要特性: 1) 模块的层次结构。 2)数据结构 。

这源自于需求分析时将真实世界问题的含蓄定义与软件解决方案的要素关联起来的分割过程。

当问题的每个部分通过一个或多个软件要素得到解决后,与问题的定义和解决相一致软件和数据结构的进化就开始了。

这个过程代表了软件的需求分析和设计之间的位置。 

(5)控制层级 Control Hierarchy

也称作程序结构,描述程序组件的组织并意味着控制层级。

它并不描述软件的程序方面,比如进程顺序、决定的事件 / 命令、或工作循环。

如下的层级图表展示了模块之间的通信流,并显示哪些模块是重复的(右上角变黑的块)。

这个图表描述了一个能够读文件,计算每个记录的值并书写报表来显示记录的信息和所完成的计算。 

(6)数据结构 Data structure

描述了单个数据间的逻辑关系。数据结构规定了数据的组织、访问方法、关联程度、和信息的选择处理。

数据结构的组织和复杂性只受限于设计者的灵活性。唯一的限制就是经典数据结构的数量阻碍了更多的久经考验的结构出现。 

(7)软件程序 Software Procedure

着重于处理每个模块的细节并必须提供一个精确的处理规范,包括事件顺序、准确的判定点、重复操作、甚至数据结构。

软件的程序表现是分层的,处理方法应该包括其所有子模块的参考。 

(8)信息隐藏 Information Hiding

的法则建议 由设计决定所刻划的模块特性应该对其余的模块不可见 。

换句话说,模块应被设计和指定为包含在模块内部且其他模块不可访问的内容对其他模块来说是无需的。

隐藏意味着有效的模块性能够通过定义一套独立的模块来实现,这些模块相互之间的通信仅仅包括实现软件功能的所必须的信息。

将使用信息隐藏作为设计标准在测试或今后的维护期间需要修改系统时带来了最大的好处。

5、软件设计方法

软件工程的基本思想是面对复杂的问题,让软件的开发按照工程的概念、原理、技术和方法模式来实施,有计划地按照要求分阶段实现。针对大型项目开发,为了保证软件产品质量,提高软件开发效率,在进行详细设计、程序设计之前,必须先确定软件总体结构。软件总体结构设计的方法主要有结构化设计、面向数据结构的设计和面向对象的设计。

5.1 结构化设计方法

结构化设计方法是应用最广泛的一种,它是建立良好程序结构的方法,提出了衡量模块质量的标准是“高内聚、低耦合”。另外,结构化设计(StructuredDesign,SD)方法是一种面向过程的设计方法或面向数据流的设计方法,它可以与结构化分析(StructuredAnalysis,SA)方法、结构化程序设计(StructuredProgramming)方法前后呼应,形成了统一、完整的系列化方法。结构化设计方法以需求分析阶段获得的数据流图为基础,通过一系列映射,把数据流图变换为软件结构图。

结构化设计所使用的工具有结构图和伪代码。结构图是一种通过使用矩形框和连接线来表示系统中的不同模块以及其活动和子活动的工具。SD方法尤其适用于变换型结构和事务型结构的目标系统。结构化设计是数据模型和过程模型的结合。在设计过程中,它从整个程序的结构出发,利用模块结构图表述程序模块之间的关系。

结构化设计的步骤如下:

①评审和细化数据流图;

②确定数据流图的类型;

③把数据流图映射到软件模块结构,设计出模块结构的上层;

④基于数据流图逐步分解高层模块,设计中下层模块;

⑤对模块结构进行优化,得到更为合理的软件结构;

⑥描述模块接口。

结构化设计方法的设计原则

使每个模块执行一个功能(坚持功能性内聚);每个模块用过程语句(或函数方式等)调用其他模块;模块间传送的参数作数据用;模块间共用的信息(如参数等)尽量少。

5.2 面向数据结构设计

面向数据结构设计是从问题的数据结构导出它的程序结构.作为独立的系统设计方法主要用于小规模数据处理的开发. 

考虑问题的出发点是:数据结构. 最终目标:得出程序的过程性描述。 

最佳适用范围:详细设计中,确定部分或全部模块的逻辑过程。

面向数据结构设计方法主要有Jackson设计方法、Warnier图。

1975年,M.A.Jackson 提出了一类至今仍广泛使用的软件开发方法。这一方法从目标系统的输入、输出数据入手,导出程序框架结构,在补充其他细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效。该方法也可与其他方法结合,用于模块的详细设计。

JSD(Jackson System Development)是Jackson面向数据的结构化编程方法(JSP,Jackon Structured Programming)的产物。

JSD的基本概念是在考虑系统的功能之前,设计应先对运行环境的实体行为建模,然后系统的功能被加入这个模型。其核心思想是由数据结构,建立目标系统的模型,并演化为相应的程序结构。

数据结构对软件设计的影响很大,如一个数据结构具有重复性,那就一定会用循环(重复)结构来控制。如果一个数据结构具有选择性质,级为可能出现,也可能不出现的信息,就一定采用条件语句来控制。若一个数据结构是分层次的,软件的结构也必然是分层次。所以,数据结构充分地揭示了软件结构。因此,面向数据的设计方法定义了一组以数据结构为指导的映射过程。

Jackson方法把问题分解为由三种基本结构形式表示的层次结构。三种基本结构形式是顺序、选择和重复。Jacckson 提出了一种与数据结构层次图非常相似的数据结构表示法,以及一种映射和转换的过程。

三种基本结构类型的表示方法如下图所示。     

004k5XOCzy6WBOMCCOp9d&690.jpg

Jackson 方法的软件设计过程是从数据结构入手,由数据结构之间的关系导出程序结构,这使软件系统的开发“有章可循”。尤其这一方法特别适合于以数据为主,“计算”较简单的数据处理系统。因此可成其为“面向数据的方法”。由于这一技术未提供对复杂系统设计过程的技术支持,因而不适合于大型实时系统或非数据处理系统的开发。但该方法比SD方法设计过程简单,所以在SD设计中,通常用Jackson 方法简化数据处理部分的设计。

5.3 面向对象设计方法

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术[1]  发展到一定阶段后的产物。

面向对象开发方法的研究已日趋成熟,国际上已有不少面向对象产品出现。面向对象开发方法有Coad方法、Booch方法和OMT方法等。

⒈Booch方法

Booch最先描述了面向对象的软件开发方法的基础问题,指出面向对象开发是一种根本不同于传统的功能分解的设计方法。面向对象的软件分解更接近人对客观事务的理解,而功能分解只通过问题空间的转换来获得。

⒉Coad方法

Coad方法是1989年Coad和Yourdon提出的面向对象开发方法。该方法的主要优点是通过多年来大系统开发的经验与面向对象概念的有机结合,在对象、结构、属性和操作的认定方面,提出了一套系统的原则。该方法完成了从需求角度进一步进行类和类层次结构的认定。尽管Coad方法没有引入类和类层次结构的术语,但事实上已经在分类结构、属性、操作、消息关联等概念中体现了类和类层次结构的特征。

⒊OMT方法

OMT方法是1991年由James Rumbaugh等5人提出来的,其经典著作为“面向对象的建模与设计”。

该方法是一种新兴的面向对象的开发方法,开发工作的基础是对真实世界的对象建模,然后围绕这些对象使用分析模型来进行独立于语言的设计,面向对象的建模和设计促进了对需求的理解,有利于开发得更清晰、更容易维护的软件系统。该方法为大多数应用领域的软件开发提供了一种实际的、高效的保证,努力寻求一种问题求解的实际方法。

⒋UML(Unified Modeling Language)语言

软件工程领域在1995年~1997年取得了前所未有的进展,其成果超过软件工程领域过去15年的成就总和,其中最重要的成果之一就是统一建模语言(UML)的出现。UML将是面向对象技术领域内占主导地位的标准建模语言。 

UML不仅统一了Booch方法、OMT方法、OOSE方法的表示方法,而且对其作了进一步的发展,最终统一为大众接受的标准建模语言。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发全过程。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论