免费智能真题库 > 历年试卷 > 系统架构设计师 > 2012年下半年 系统架构设计师 下午试卷 案例
  第1题      
  知识点:   管道   需求分析   调试   调试过程   集成开发环境   开发环境   评审   软件工具   软件设计   数据存储

 
【说明】
某软件公司为其新推出的字处理软件设计了一种脚本语言,专门用于开发该字处理软件的附加功能插件。为了提高该语言的编程效率,公司组织软件工具开发部门为脚本语言研制一套集成开发环境软件工具开发部门根据字处理软件的特点,对集成开发环境进行了需求分析,总结出以下3项核心需求:
(1) 集成开发环境需要提供对脚本语言的编辑、语法检查、解释、执行和调试等功能的支持,并要实现各种功能的灵活组合、配置与替换。
(2) 集成开发环境需要提供一组可视化的编程界面,用户通过对界面元素拖曳和代码填充的方式就可以完成功能插件核心业务流程的编写与组织。
(3) 在代码调试功能方面,集成开发环境需要实现在脚本语言编辑界面中的代码自动定位功能。具体来说,在调试过程中,编辑界面需要响应调试断点命中事件,并自动跳转到当前断点处所对应的代码。
针对上述需求,软件工具开发部门对集成开发环境的架构进行分析与设计,王工认为该集成开发环境应该采用管道-过滤器的架构风格实现,李工则认为该集成开发环境应该采用以数据存储为中心的架构风格来实现。公司组织专家对王工和李工的方案进行了评审,最终采用了李工的方案。
 
问题:1.1   请用200字以内的文字解释什么是软件架构风格,并从集成开发环境与用户的交互方式、集成开发环境的扩展性、集成开发环境的数据管理三个方面说明为什么最终采用了李工的设计方案。
 
问题:1.2   在对软件系统架构进行设计时,要对架构需求进行分析,针对特定需求选择最为合适的架构风格,因此实际的软件系统通常会混合多种软件架构风格。请对核心需求进行分析,说明为了满足需求(2)和(3),分别应采用何种架构风格,并概要说明采用相应架构风格后的架构设计过程。
 
 
 

   知识点讲解    
   · 管道    · 需求分析    · 调试    · 调试过程    · 集成开发环境    · 开发环境    · 评审    · 软件工具    · 软件设计    · 数据存储
 
       管道
        管道是提供非结构化数据交换和实现任务同步的内核对象。每个管道有两个端口,一端用来读,另一端用来写。数据在管道中就像一个非结构的字节流,数据按照FIFO方式从管道中读出。一般EOS内核支持两类管道对象:
        (1)命名管道。具有一个类似于文件名的名字,像文件或设备一样,出现在文件系统中,需要使用命名管道的任何任务或ISR都可以用该名字对其进行引用。
        (2)无名管道。一般动态创建,且必须使用创建时返回的描述符才可引用此类型的管道。
        通常,管道支持以下几种操作:创建和删除一个管道、读、写管道、管道控制、管道上的轮询。
 
       需求分析
        需求分析的方法种类繁多,不过如果按照分解的方式不同,可以很容易地划分出几种大类型:
        (1)结构化分析方法。本节后续内容将详细讨论SA的内容。
        (2)面向对象分析方法。将在9.4节中进行详细介绍。
        (3)面向问题域的分析(Problem Domain Oriented Analysis,PDOA)方法。PDOA更多地强调描述,而少强调建模。它的描述大致分为关注问题域和关注解系统的待求行为这两个方面。问题框架是PDOA的核心元素,是将问题域建模成为一系列相互关联的子域。也可以把问题框架看作是开发上下文图,但不同的是上下文图的建模对象是针对解系统,而问题框架则是针对问题域。也就是说,问题框架的目标就是大量地捕获更多有关问题域的信息。PDOA方法现在还在研究阶段,并未广泛应用。
               业务流程分析
               业务流程分析的目的是了解各个业务流程的过程,明确各个部门之间的业务关系和每个业务处理的意义,为业务流程的合理化改造提供建议,为系统的数据流程变化提供依据。
               业务流程分析的步骤如下:
               (1)通过调查掌握基本情况。
               (2)描述现有业务流程(绘制业务流程图)。
               (3)确认现有业务流程。
               (4)对业务流程进行分析。
               (5)发现问题,提出解决方案。
               (6)提出优化后的业务流程。
               在业务流程图中使用的基本符号如下图所示。
               
               业务流程图符号
               数据流图
               DFD是结构化分析中的重要方法和工具,是表达系统内数据的流动并通过数据流描述系统功能的一种方法。DFD还可被认为是一个系统模型,在信息系统开发中,一般将它作为需求说明书的组成部分。
               DFD从数据传递和加工的角度,利用图形符号通过逐层细分描述系统内各个部件的功能和数据在它们之间传递的情况,来说明系统所完成的功能。具体来说,DFD的主要作用如下:
               (1)DFD是理解和表达用户需求的工具,是系统分析的手段。由于DFD简明易懂,理解它不需要任何计算机专业知识,因此通过它同客户交流很方便。
               (2)DFD概括地描述了系统的内部逻辑过程,是系统分析结果的表达工具,因而也是系统设计的重要参考资料,是系统设计的起点。
               (3)DFD作为一个存档的文字材料,是进一步修改和充实开发计划的依据。
               在DFD中,通常会出现4种基本符号,分别是数据流、加工、数据存储和外部实体(数据源及数据终点)。数据流是具有名字和流向的数据,在DFD中用标有名字的箭头表示。加工是对数据流的变换,一般用圆圈表示。数据存储是可访问的存储信息,一般用直线段表示。外部实体是位于被建模的系统之外的信息生产者或消费者,是不能由计算机处理的成分,它们分别表明数据处理过程的数据来源及数据去向,用标有名字的方框表示。下图是一个典型的DFD示例。
               
               办理取款手续的DFD
               为了表达数据处理过程中的数据加工情况,用一个DFD是不够的。稍微复杂的实际问题,在DFD中常常出现十几个甚至几十个加工。这样的DFD看起来很不清楚。层次结构的DFD能很好地解决这一问题。按照系统的层次结构进行逐步分解,并以分层的DFD反映这种结构关系,能清楚地表达整个系统。
               下图给出分层DFD的示例。数据处理S包括三个子系统1、2、3。顶层下面的第一层DFD为DFD/L1,第二层的DFD/L2.1、DFD/L2.2及DFD/L2.3分别是子系统1、2和3的细化。对任何一层数据流图来说,我们称它的上层图为父图,在它下一层的图则称为子图。
               
               分层数据流图
               概括地说,画DFD的基本步骤,就是“自顶向下,逐层分解”。检查和修改的原则如下:
               (1)DFD中的所有图形符号只限于前述4种基本图形元素。
               (2)顶层DFD必须包括前述4种基本元素,缺一不可。
               (3)顶层DFD中的数据流必须封闭在外部实体之间。
               (4)每个加工至少有一个输入数据流和一个输出数据流。
               (5)在DFD中,需按层给加工框编号。编号表明了该加工处在哪一层,以及上下层的父图与子图的对应关系。
               (6)规定任何一个数据流子图必须与它上一层的一个加工对应,两者的输入数据流和输出数据流必须一致。此即父图与子图的平衡。
               (7)可以在DFD中加入物质流,帮助用户理解DFD。
               (8)图上每个元素都必须有名字。
               (9)DFD中不可夹带控制流。
               数据字典
               数据字典是关于数据的信息的集合,也就是对DFD中包含的所有元素的定义的集合。DFD和数据字典共同构成系统的逻辑模型。没有DFD,数据字典难以发挥作用;没有数据字典,DFD就不严格。只有把DFD和对DFD中每个元素的精确定义放在一起,才能共同构成系统的规格说明。
               数据字典的设计包括:数据流设计、数据元素字典设计、数据处理字典设计、数据结构字典设计和数据存储设计。这些设计涵盖了数据的采集和范围的确定等信息。在数据字典的每一个词条中应包含以下信息名称、别名或编号、分类、描述、何处使用。
               对加工的描述是数据字典的组成内容之一,常用的加工描述方法有结构化语言、判定树及判定表。
               (1)结构化语言:介于自然语言和形式语言之间的一种半形式语言,在自然语言基础之上加了一些限度,使用有限的词汇和有限的语句来描述加工逻辑。结构化语言是受结构化程序设计思想启发而扩展出来的。结构化程序设计只允许3种基本结构。结构化语言也只允许3种基本语句,即简单的祈使语句、判断语句和循环语句。与程序设计语言的差别在于结构化语言没有严格的语法规定,与自然语言的不同在于它只有极其有限的词汇和语句。结构化语言使用三类词汇:祈使句中的动词、数据字典中定义的名词及某些逻辑表达式中的保留字。
               (2)判定树:若一个动作的执行不只依赖一个条件,而与多个条件有关,那么这项策略的表达就比较复杂。如果用结构化语言的判断语句,就有多重嵌套,层次一多,可读性就会下降。用判定树来表示,可以更直观一些。
               (3)判定表:一些条件较多、在每个条件下取值也较多的判定问题,可以用判定表表示。判定表能清晰地表达复杂的条件组合与应做动作之间的对应关系,判定表的优点是能够简洁、无二义性地描述所有的处理规则。但判定表表示的是静态逻辑,是在某种条件取值组合情况下可能的结果,它不能表达加工的顺序,也不能表达循环结构,因此判定表不能成为一种通用的设计工具。
 
       调试
        调试的任务就是根据测试时所发现的错误,找出原因和具体的位置,进行改正。调试主要由程序开发人员来进行,谁开发的程序就由谁来进行调试。常用的调试方法有试探法、回溯法、对分查找法、归纳法和演绎法。
 
       调试过程
        调试的过程如下图所示。首先执行设计的测试用例,对测试结果进行分析,如果有错误,需要运用调试技术,找出错误原因和具体的位置。调试结果有两个:一是能确定错误原因并进行了纠正,为了保证错误已排除,需要重新执行暴露该错误的原测试用例以及某些回归测试(即重复一些以前做过的测试);另一种是未找出错误原因,那么只能对错误原因进行假设,根据假设设计新的测试用例证实这种推测。若推测失败,需进行新的推测,直至找到错误并纠正。通常确定错误原因和具体的位置所需的工作量在调试过程中是非常大的,大约占调试总工作量的95%,而且花费的时间也不确定。
        
        调试过程
 
       集成开发环境
        嵌入式软件开发环境起初主要由专门开发工具的公司提供,这些公司根据不同操作系统和不同处理器版本进行专门定制,如美国Microtec公司的交叉开发工具曾经被VRTX、pSOS等定制采用。随着用户对开发工具套件的需求增加,一些著名的操作系统供应商开始发展本系列操作系统产品的开发工具套件,如WindRiver公司的Tornado、微软的Windows CE嵌入式开发工具包等。
        在国际上,嵌入式软件开发环境的另一支研发队伍是GNU。GNU在因特网上提供免费的相关研究和开发成果,成为自主开发嵌入式软件开发环境的重要资源。一些公司已在GNU软件的基础上,经过集成、优化和测试,推出更加成熟、稳定的商业化嵌入式软件开发环境。
        随着嵌入式系统的发展,嵌入式软件开发环境越来越重要,它直接影响到嵌入式软件的开发效率和质量。目前的开发环境已向开放性、集成化、可视化和智能化的方向发展,将各种类型且功能强大的软件工具,如编辑器、编译器、连接器、调试器、版本管理、用户界面等,有机地集成在一个统一的集成开发环境(Integrated Development Environment,IDE)中。
               Tornado
               Tornado是WindRiver公司推出的一个集成开发环境。它由三个高度集成的部分组成:运行在宿主机和目标机上的交叉开发工具和实用程序;运行在目标机上的实时操作系统VxWorks;用来连接宿主机和目标机的各种通信介质,如以太网、串口、在线仿真器ICE或ROM仿真器等。
               Tornado提供的交叉开发工具和实用工具主要有:源代码编辑工具、图形化的交叉调试工具、工程配置工具、集成仿真工具、诊断分析工具、C/C++编译工具、宿主机-目标机连接配置工具、目标机系统状态浏览工具、命令行执行工具、多语言浏览工具及图形化内核配置工具等。在Tornado中,宿主机上的工具与目标机之间的通信由目标服务器和目标代理共同完成。如下图所示,在形式上目标代理是VxWorks上的一个任务。调试命令通过宿主机上的目标服务器发送给目标代理。这些调试请求决定了目标代理应如何控制目标机上的其他任务。
               
               Tornado环境中宿主机与目标机之间的关系
               .图形化的交叉调试器CrossWind/WDB:支持任务级和系统级两种调试方式,支持混合源代码和汇编代码显示,支持多目标同时调试,具有良好的图形用户界面。
               .工程配置工具Project:用于对VxWorks操作系统及其组件进行自动配置,进行依赖性分析和代码容量计算,自动生成Makefile文件。
               .集成仿真工具VxSim:提供与真实目标机完全一致的调试和仿真运行环境。
               .诊断分析工具WindView:一个图形化的动态诊断和分析工具,主要是向开发者提供在目标机上运行的应用程序的许多详细情况。
               .C/C++编译工具:Tornado提供以下支持C语言和C++语言的工具和类库:Diab C/C++编译器、GNU C/C++编译器及iostreams类库。
               .宿主机-目标机连接配置工具Launcher:位于Tornado环境的最上层,开发者可以通过它来设置开发环境。
               .目标机系统状态浏览工具Browser:一个图形化工具,能随时提供目标系统的全面状态信息。
               .命令行执行工具WindSh:一个功能强大的命令行解释器,可以直接解释、执行C语言表达式,调用目标机上的C函数及访问已在系统符号表中定义的变量。
               .多语言浏览工具WindNavigator:浏览源程序代码,用图形化的方式显示函数调用关系,从而实现快速的代码定位。
               .图形化内核配置工具WindConfig:通过WindConfig提供的图形向导,用户可以方便地配置VxWorks内核及其组件的参数。
               Tornado的特点:
               (1)友好的开发环境。Tornado可以运行在不同的系统中,支持UNIX、Windows NT、Windows 98/95等。
               (2)适用于开发不同类型的目标机。针对不同的目标机,Tornado为开发者提供了一个一致的图形接口和人机界面。这样,当开发人员转向新的目标机时,不必再花费时间去学习或适应新的开发工具。事实上,Tornado的所有工具都驻留在开发平台上。
               (3)工具齐备,具有丰富的交叉开发工具和实用工具。
               (4)开放的、可扩展的开发环境。Tornado是一个完全开放的环境,开发人员或第三方厂商可以很容易地把自己的工具集成到Tornado框架下。
               Windows CE应用程序开发工具
               如下图所示,Windows CE应用程序开发工具包括:①Platform Builder;②eMbedded Visual Tools;③eMbedded Visual Basic;④eMbedded Visual C++。它们都是专门针对Windows CE操作系统的开发工具。
               
               Windows CE应用程序开发工具
               Microsoft Windows CE Platform Builder为开发商迅速创建一个嵌入式系统提供了全部相关工具。Platform Builder集成开发环境使开发者能够对新一代高度模块化的设计进行配置、创建与调试,以实现嵌入式系统的灵活性与可靠性,并与Windows和Web功能特性紧密结合。它的特点主要包括:
               .通过使用改进的目标-宿主集成与连接特性来提高工作效率,节省嵌入式系统的创建时间。这些特性包括:集成化连接与下载、集成化目标控制、状态监视器、灵活的创建选择、简化操作系统配置等。
               .通过使用先进的系统级调试功能来提高调试速度。Platform Builder的系统级调试器目前可为硬件辅助和系统级调试提供支持,从而大大扩展了调试功能的作用范围。具体包括:硬件辅助调试、源点级调试、新型的内核追踪器、远程系统信息、远程性能监视器、改进的调试器用户界面、调试区间等。
               .提供了一个新型扩展模型,可以帮助开发商将各类特性集成到开发环境当中。包括:微处理器控制单元、嵌入式开发工具控制单元等。
               Microsoft eMbedded Visual C++和eMbedded Visual Basic是开发下一代Windows CE通信、娱乐及信息访问等应用程序时的功能强大的工具。它们所提供的全面高速应用程序开发环境能够帮助开发者在各类不同设备上,迅速就相关的Windows CE应用程序进行创建、调试和部署,并且在不牺牲控制功能、性能表现及有关灵活性的前提下,提高Windows CE的开发效率。这两个产品的特点主要包括:
               .开发工作效率比较高。这两个集成开发环境与传统的Windows应用开发环境非常相似,因此开发人员无需额外的培训即可熟练掌握它们的使用方法。而编程时的在线提示辅助功能(如语句完成、参数信息和语法错误检查等),能够大大提高程序员的工作效率。另外,通过创建可重复使用的ActiveX组件,可以将软件开发的复杂程度降至最低水平。
               .开发过程与集成化调试得以简化。允许eMbedded Visual Tools在编译完成后,从移动设备或模拟器上的IDE中自动复制并启动相关的应用程序,从而实现应用程序的迅速测试和执行。在调试程序时,可以使用集成化调试器,当应用程序在Windows CE设备上(或模拟器内)运行的同时对其错误予以消除。另外,在测试时可以先在Windows CE设备模拟器上对应用程序进行测试,以避免高昂的硬件成本投资。
               .针对Windows CE平台的全面访问。包括TCP/IP通信机制、COM组件模型、ActiveX控件、设备的API接口函数等。
               .面向最新的Windows CE设备创建相应的解决方案。例如,Handheld PC Pro、Palm-size PC及Pocket PC等Windows CE设备。
               .迅速、灵活的数据访问。数据存储可通过相关连接来实现与远程数据源之间的同步。
               Linux环境下的集成开发环境
               在Linux环境下也有一些很好的集成开发环境,如Kdevelop、Eclipse和Anjuta等。
                      Kdevelop
                      Kdevelop是KDE小组开发的Linux/UNIX操作系统上的C/C++集成开发环境,为快速开发C/C++应用程序提供了强有力的开发工具。
                      Kdevelop的操作界面类似于微软的Visual Studio,提供编辑、编译、连接、除错、版本管理及计划管理等基本的IDE功能。此外它还内建了一个可以产生Qt图形界面的资源编辑程序。对于C++程序,它额外提供了类浏览器。此外其文件管理程序内建了所有有关KDE发展所需的文件,并提供搜寻的功能。
                      Eclipse
                      Eclipse是替代IBM Visual Age for Java(简称IVJ)的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境。根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。目前,Eclipse已经开始提供C语言开发的功能插件。而且它是一个开放源代码的项目,任何人都可以下载其源代码,并在此基础上开发自己的功能插件。
                      Anjuta
                      Anjuta是GNU/Linux平台下的C/C++集成开发环境,它主要是为了开发GTK/GNOME程序而设计的。Anjuta利用GLADE来生成优美的用户界面,加之以自己强大的源程序编辑功能,使之成为应用程序快速开发的集成开发环境。以前,人们使用GLADE做界面,用emacs或vi来编辑源程序,再用某种终端模拟器编辑开发项目。而现在使用Anjuta,所有这些繁杂零散的任务都可以在一个统一的、集成的、自然而然的环境下完成。
 
       开发环境
        下图是一个典型的CPD环境,通常包含三个高度集成的部分:
        (1)运行在宿主机和目标机上的强有力的交叉开发工具和实用程序。
        (2)运行在目标机上的高性能、可裁剪的RTOS。
        (3)连接宿主机和目标机的多种通信方式。例如,以太网、串口线、ICE(In-Circuit Emulator,在线仿真器)、ROM仿真器等。
        宿主机提供的基本开发工具有交叉编译器、交叉链接器和源代码调试器等,作为目标机的嵌入式系统则可能提供一个动态装载器、链接装载器、监视器和一个调试代理等。在目标机和宿主机之间有一组连接,通过这组连接程序代码,映像从宿主机下载到目标机,这组连接同时也用来传输宿主机和目标机调试代理之间的信息。
        
        典型交叉平台开发环境
        目前,嵌入式系统中常用的目标文件格式是COFF(Common Object File Format)和ELF(Executable Linking Format)。另外,一些系统还需要有一些专门工具将上述格式转换成二进制代码格式才可使用。典型地,一个目标文件包含:
        (1)关于目标文件的通用信息,如文件尺寸、启动地址、代码段和数据段等具体信息。
        (2)机器体系结构特定的二进制指令和数据。
        (3)符号表和重定位表。
        (4)调试信息。
 
       评审
        对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方法的可行性,关键的处理及内外部接口定义的正确性、有效性、各部分之间的一致性等都一一进行评审。
 
       软件工具
        软件工具的种类繁多,按照软件过程的活动可以划分为支持软件开发过程的工具、支持软件维护过程的工具、支持软件管理过程和支持过程的工具等。
        1)软件开发工具
        对应于软件开发过程的各种活动,软件开发工具通常有需求分析工具、设计工具、编码与排错工具、测试工具等。
        2)软件维护工具
        辅助软件维护过程的软件称为软件维护工具,它辅助维护人员对软件代码及其文档进行各种维护活动。软件维护工具主要有版本控制工具、文档分析工具、开发信息库工具、逆向工程工具和再工程工具。
        3)软件管理和软件支持工具
        软件管理和软件支持工具用来辅助管理人员和软件支持人员的管理活动和支持活动,以确保高质量地完成软件开发。辅助软件管理和软件支持的工具中常用的有项目管理工具、配置管理工具和软件评价工具。
        4)软件开发工具的评价和选择
        可以根据以下标准来衡量软件开发工具的优劣:功能、易用性、稳健性、硬件要求和性能、服务和支持。
 
       软件设计
               软件设计的任务
               在给定系统的需求规格说明书后,需要对软件的结构进行设计,并对设计的过程进行管理。在嵌入式系统的软件设计过程中,需要完成以下一些任务。
                      准备工作计划
                      在软件设计之前,首先要制订详细的工作计划,其内容包括:
                      .过程管理方案:包括软件开发的进度管理、软件规模和所需人年的估算、开发人员的技能培训等;
                      .开发环境的准备方案:包括开发工具的准备、开发设备的准备、测试装备的准备、分布式开发环境下的开发准则等;
                      .软硬件联机调试的方案:联调的起始时间、地点、人员和具体的准备工作;
                      .质量保证方案:包括质量目标计划、质量控制计划等;
                      .配置控制方案:包括配置控制文档的编写、配置控制规则的制订等。
                      确定软件的结构
                      设计软件的各个组成部分,包括:
                      .任务结构的设计:使用操作系统提供的函数,设计出一个最佳的任务结构;
                      .线程的设计;
                      .公共数据结构的设计:在确保系统一致性的基础上,设计出所需的公共数据;
                      .操作系统资源的定义;
                      .类的设计;
                      .模块结构设计:在设计时要充分考虑模块的划分、标准化、可重用和灵活性等;
                      .内存的分配与布局。
                      设计评审
                      对于软件设计的结果,进行一次设计评审,并在必要时对设计进行修正。具体内容包括:
                      .确认每件工作的执行方法是否恰当,其内容是否完善;
                      .确认该设计完成了系统需求规格说明书所要求的功能和服务;
                      .评估任务结构设计、评估类的设计、评估模块结构设计;
                      .对软件设计的结果进行总结,编写出相应的文档。
                      维护工作计划
                      执行软件设计工作控制,在每日、每周和每月的时间粒度上对进度进行控制,确保软件设计能够如期完成。
                      与硬件部门密切合作、相互协调
                      根据工作计划中的安排,定期与硬件部门召开会议,协调各自的进展。如果软件规格说明书发生了变化,立即进行调整,重新进行软件设计。
                      控制工作的结果,把工作记录存档
                      掌握当前的工作进展情况,尽早地发现和分析问题,并采取相应的措施。对各种事件进行跟踪记录,包括:
                      .执行过程控制,跟踪进展情况并定期记录、存档。
                      .执行质量控制,保留质量记录。
                      .记录产品的配置、版本变化、bug的发现和处理等信息。
               软件架构设计
               软件架构也称为软件体系结构,需要考虑如何对系统进行分解,对分解后的组件及其之间的关系进行设计,满足系统的功能和非功能需求。软件架构形成过程如下图所示。
               
               架构的形成过程概要
               软件架构设计需要从用户业务需求、未来应用环境、需求分析、硬件基础、接口输入、数据处理、运算或控制规律、用户使用等方面进行综合、权衡和分析基础上产生。面向某种问题的架构一旦确定就很难改变,随后的架构设计需要通过一系列的迭代开发完善,使得软件架构日趋成熟、稳定。
               软件架构的重要作用也在于控制一个软件系统的使用、成本和风险。好的架构要求是和谐的软件架构,包括与上一级系统架构相互和谐、与系统中同一级的其他组件架构互相和谐,确保系统满足性能、可靠性、安全性、信息安全性和互操作性等方面的关键要求,也具有可扩展、可移植性,从而为一个软件带来长久的生命力。
               在大量开发实践中,有很多广泛使用并被普遍接受的软件架构设计原则,这些原则独立于具体的软件开发方法,主要包括抽象、信息隐藏、强内聚和松耦合、关注点分离等。
               (1)抽象:这是软件架构的核心原则,也是人们认识复杂客观世界的基本方法。抽象的实质是提取主要特征和属性,从具体的事务中通过封装来忽略细节,并且运用这些特征和属性,描述一个具有普遍意义的客观世界。软件架构设计中需要对流程、数据、行为等进行抽象。复杂系统含有多层抽象,从而有多个不同层次架构。
               (2)信息隐藏:包括局部化设计和封装设计。局部化设计就是将一个处理所涉及到的信息和操作尽可能地限制在局部的一个组件中,减少与其他组件的接口。而封装设计是将组件的外部访问形式尽可能简单、统一。
               (3)强内聚和松耦合:强内聚是指软件组件内的特性,即组件内所有处理都高度相关,所有处理组合在一起才能组成一个相对完整的功能。而松耦合是指软件组件之间的特性,软件组件之间应尽量做到没有或极少的直接关系,使其保持相对独立,这样使得未来的修改、复用简单,修改之后带来的影响最小。
               (4)关注点分离:所谓关注点是软件系统中可能会遇到的多变的部分。如为适应不同运行接口条件,需要进行适应性的参数调整和驱动配置。关注点分离设计是将这部分组件设计成为相对独立的部分,使未来的系统容易配置和修改。而核心的部分可以保持一个相对独立的稳定状态。如果功能分配使得单独的关注点组件足够简单,那么就更容易理解和实现。但“展示某些关注点得到满足时,可能会影响到其他方面的关注点,但架构师必须能够说明所有关注点都已得到满足”。
               以上的原则中,删除需求细节或对细节进行抽象是最重要的工作,为用户的需求创建抽象模型,通过抽象将特殊问题映射为更普遍的问题类别,并识别各种模式。
               软件架构设计使用纵向分解和横向分解两种方式。纵向分解就是分层,横向分解就是将每一个层面分成相对独立的部分。经过分解之后,可以将一个完整的问题分解成多个模块来解决。模块是其中可分解、可组装,功能独立、功能高度内聚、之间低耦合的一个组件。
               类似于建筑架构,软件架构也决定了软件产品的好用、易用、可靠、信息安全、可扩展、可重用等特性,好的软件架构也给人完整、明确、清晰等赏心悦目的感觉,具有较长的生命力。
               架构设计是围绕业务需求带来的问题空间到系统解决空间第一个顶层设计方案。按照抽象原则,在这个阶段进行的架构设计关注软件设计环节抽象出来的重要元素,而不是所有的设计元素。在架构设计时将软件这些要素看作是黑盒,架构设计需要满足黑盒的外部功能和非功能需求的目标。一个软件的架构设计首先为软件产品的后续开发过程提供基础,在此基础上可将一个大规模的软件分解为若干子问题和公共子问题。而一般意义的软件设计是软件的底层设计,开发人员需要关注各子问题或要素的进一步分解和实现,是根据架构设计所定义的每个要素的功能、接口,进一步实现要素组件内部的配置、处理和结构。在遵守组件外部属性前提下,考虑实现组件内部的细节及其实现方法。对于其中的公共子问题,形成公共类和工具类,从而可以达到重用的目的。
               一般的软件构架是根据需求自上而下方式来设计,即首先掌握和研究利益相关方的关键需求,基本思路是首先进行系统级的软件架构设计,需要将软件组件与其外部环境属性绑定在一起,关注软件系统与外部环境的交联设计;其次将一个大的系统划分成各组成部分,这些部分可以按照架构设计的不同方法,分为层次或成为模块;之后再开始研究所涉及到的要素,再实现这些要素以及定义这些要素之间的关系。
               在实际工作中,软件构架也可采用自底向上的方法,前提是已经建立了一个成熟稳定的软件架构,也可以称之为“模式”。模式是组织一级设计某一类具体问题的顶层思路,是为了解决共有问题解的方案模板,但并不是一个问题的设计或设计算法。
               模式常常整合在一起使用,提供解决更大、更复杂问题的解决方案,而组成一个解决问题的通用框架。框架往往提供统一平台和开发工具,而且已经高效地利用了已经经过验证的模式、技术和组件。在新软件系统的设计中指定沿用或重用这种架构框架,这时其他重要元素可以在这个架构基础上针对新的需求进行扩展,有时是针对性地进行参数化设计。所以在架构设计中可以借用模式的概念进行设计,采用成熟的先进的设计框架和工具提高开发的效率,保证设计正确性。
               下图所示是针对架构设计中非功能需求的多维度分析,从中可知任何一个因素的变化都会带来对其他因素的影响。实际上软件架构设计属于软件设计过程的一部分,但超越了系统内部的算法和数据结构的详细设计。
               
               架构的多维度分析
               在架构设计阶段,需要定义边界条件、描述系统组织结构、对系统的定量属性进行约束、帮助对模型进行描述并基本构造早期的原型、更准确地描述费用和时间的评估。
               软件设计方法
               在将系统分解为各个组件的过程中,需要采取不同的策略,而每个策略则关注不同的设计概念。根据分解过程中所采用的不同策略,设计方法有基于功能分解的设计方法、基于信息隐藏的设计方法和基于模型驱动开发的设计方法等分类。
               (1)基于功能分解的设计方法。实时结构化分析与设计采用了功能分解,系统被分解为多个函数,并且以数据流或控制流的形式定义函数之间的接口;基于并发任务结构化的设计(Design Approach for Real-Time Systems,DARTS)提供了任务结构化标准,辅助人员确定系统中的并发任务,并指导定义任务接口。
               (2)基于信息隐藏的设计方法。面向对象(Object Oriented,OO)设计方法将数据和数据上操作封装在对象实体中,对象外界不能够直接对对象内部进行访问和操作,只能通过消息间接访问对象,符合人类思维方式,提高软件的扩展性、维护性和重用性。
               (3)基于模型驱动开发的设计方法。通过借助有效的(Model Driven Development,MDD)工具,构建和维护复杂系统的设计模型,直接产生高质量的代码,将开发的重心从编码转移到设计。当前使用较为广泛的MDD工具有IBM公司的Rhapsody。
 
       数据存储
        数据存储用来表示存储数据。通常,一个流入加工的数据流经过加工处理后就消失了,而它的某些数据(或全部数据)可能被加工成输出数据流,流向其他加工或外部实体。除此之外,在软件系统中还常常要把某些信息保存下来以供以后使用,这时可以使用数据存储。每个数据存储都有一个定义明确的名字标识。可以有数据流流入数据存储,表示数据的写入操作;也可以有数据流从数据存储流出,表示数据的读操作;还可以用双向箭头的数据流指向数据存储,表示对数据的修改。
   题号导航      2012年下半年 系统架构设计师 下午试卷 案例   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
 
第1题    在手机中做本题