第六章 经典软件体系结构.docx

上传人:b****5 文档编号:14639269 上传时间:2023-06-25 格式:DOCX 页数:15 大小:144.39KB
下载 相关 举报
第六章 经典软件体系结构.docx_第1页
第1页 / 共15页
第六章 经典软件体系结构.docx_第2页
第2页 / 共15页
第六章 经典软件体系结构.docx_第3页
第3页 / 共15页
第六章 经典软件体系结构.docx_第4页
第4页 / 共15页
第六章 经典软件体系结构.docx_第5页
第5页 / 共15页
第六章 经典软件体系结构.docx_第6页
第6页 / 共15页
第六章 经典软件体系结构.docx_第7页
第7页 / 共15页
第六章 经典软件体系结构.docx_第8页
第8页 / 共15页
第六章 经典软件体系结构.docx_第9页
第9页 / 共15页
第六章 经典软件体系结构.docx_第10页
第10页 / 共15页
第六章 经典软件体系结构.docx_第11页
第11页 / 共15页
第六章 经典软件体系结构.docx_第12页
第12页 / 共15页
第六章 经典软件体系结构.docx_第13页
第13页 / 共15页
第六章 经典软件体系结构.docx_第14页
第14页 / 共15页
第六章 经典软件体系结构.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第六章 经典软件体系结构.docx

《第六章 经典软件体系结构.docx》由会员分享,可在线阅读,更多相关《第六章 经典软件体系结构.docx(15页珍藏版)》请在冰点文库上搜索。

第六章 经典软件体系结构.docx

第六章经典软件体系结构

第六章经典软件体系结构

本章介绍经典的软件体系结构,主要包括MaryShaw等人所总结的一些软件体系结构分格。

众所周知,计算机学科历史较短,因此,软件架构的研究历史更短。

本章所谓的经典软件体系结构也仅仅是指在20世纪80年代至21世纪初期间提出的成功的软件体系结构。

本章将介绍调用-返回分格软件体系结构、数据流风格软件体系结构、基于事件的软件体系结构、层次软件体系架构与MVC软件体系结构。

6.1调用-返回风格软件体系结构

相对于一些基础学科,计算机学科的发展历史较短。

20世纪50年代才出现了适合商业应用的软件开发语言。

软件设计与开发也经历了从初级到高级的历程。

回顾历史,从20世纪50年代到60年代末,属于非结构化简单程序开发阶段,软件设计方面采用简单程序模型,典型的开发语言Algol(1958)、COBOL(1959)和Basic(1964);从20世纪70年代初到80年代初,属于结构化设计编程阶段,典型的开发语言有Pascal(1968)、C(1972)、FORTRAN和Perl。

虽然从20世纪60年代开始就有了面向对象概念的讨论,但是直到20世纪80年代初正式开始才面向对象设计编程阶段,就有了代表性的面向对象软件开发语言包括SmallTalk、Ada、C++(1983)和Java(1995)。

本节首先简要回顾非结构化编程,然后介绍对软件设计有重要的影响的调用-返回风格软件体系结构,重点介绍其中的主程序-子程序软件体系结构与面向对象软件体系结构,并对它们进行讨论。

6.1.1非结构化编程简介

非结构化编程技术是历史上最早的编程范型。

紧随其后的是结构化设计/编程技术与面向对象设计/编程技术。

一个由非结构化语言编写的程序通常包含一系列有序的命令,或者称为语句,通常是每个语句占一行,每行都有标记一个行号或者可能是标签。

这样做的目的事允许程序执行流可以依据行号从一行跳到程序的其他指定的行。

支持非结构化编程的语言包括早期的BASIC与COBOL。

非结构化编程引入基本的循环、分支与跳跃等控制流的概念。

在非结构化编程中,虽然出现了较为原始的子程序的概念,但其与结构化编程中过程(Procedure)的概念有本质的区别。

非结构化编程中的子程序允许有多个入口和多个出口,理论上允许程序在任何地方转入子程序或退出子程序,而在这结构化编程中是不允许的。

虽然非结构化编程所编写的程序很难理解,并且经常遭到批评,但是早期的银行与金融机构软件代码都是由非结构化编程语言(例如COBOL)写的。

目前,非结构化编程已成为历史,现在很少使用(除了有些银行与金融业企业仍然使用COBOL进行开发,但和早期的版本相比有了很多改善,例如COBOL97包括常规改善并且具备了面向对象的特征),因此本节将不把注意力放在非结构化编程方面,而主要介绍采用结构化设计方法的主程序-子程序软件体系结构与采用面向对象设计方法的面向对象软件体系结构。

在介绍这两种软件体系结构以前,首先介绍调用-返回风格的体系结构的概念。

6.1.2调用-返回风格软件体系结构的概念

调用-返回风格体系结构(CallandReturnArchitecture)是在过去的30年内具有深远影响的软件体系结构。

本节要介绍的共享数据的主程序-子程序体系结构与面向对象体系结构可以被认为是调用-返回风格体系结构的子类型。

因此,熟悉调用-返回风格架构对于理解这两个体系结构有重大意义。

利用调用-返回风格软件体系结构设计的软件系统使用的是分而治之策略,其主要的思想是将一个复杂的大系统分解为一些子系统,以便降低复杂度,并且增加可修改性。

这种系统的程序执行顺序通常只由一个单线程控制。

例如,一个软件架构C,只有从另外一个调用者软件构件B得到控制以后,才能执行该构件C的程序;当运行结束以后,将控制返回给软件构件B。

该程序的运行控制流如图6.1所示。

图中的长箭头可以理解为是一个程序构件对另外一个构件的调用,而短箭头为程序运行控制流的走向,这也就是名称“调用-返回”的由来。

 

图6.1调用-返回风格软件体系结构大的程序运行控制流示意图

每个软件构件都设计为有一个唯一的程序执行起点和唯一的程序执行终点,或者称为程序执行入口和程序执行出口。

程序从其执行入口开始执行该构件的代码,运行至该构件的程序执行的出口,然后程序执行结束,而将控制返回给程序调用构件。

上述程序构件通常叫做子程序(Subroutine),从一个构件到另外一个构件的控制传递叫做子程序调用(Call)。

子程序调用程序都有参数传递。

拥有整个软件入口的构件叫做主程序(MainProgram),它控制子程序的执行顺序。

在这种风格的系统中,也可能有一些被动的数据构件,其中存储供子程序的访问的共享数据。

可以被所有软件构件访问的共享数据被称为全局变量。

这种调用-返回风格体系结构的组织与执行的动态控制可以由高级程序语言的过程(Procedure)、函数(Function)或者方法(Method)来实现。

调用-返回风格架构可以被组织成任何形式,例如,可以将程序设计为如图6.2所示的结构图。

在该图中,箭头代表调用,方块内有“Sub”字样的是子程序,有“GlobalDate”字样的为数据构件。

图6.2设计的逻辑关系比较复杂,因此,通常人们往往喜欢将其组织成如图6.3所示的层次结构。

这样组织成层次结构的调用-返回风格架构设计叫做共享数据的主程序-子程序软件体系架构,其原因是在调用-返回体系结构中包括一个控制其他组件的主程序,该程序选择调用在其下层的软件组件(模块、函数),而该软件组件又往往调用其下层的软件组件。

每次调用都执行一个子任务,并且返回一个值。

主程序-子程序体系结构是较早出现的软件体系结构。

 

图6.2应用调用-返回风格架构的设计

以上介绍的调用-返回风格软件体系结构对于理解当今流行软件体系结构有着重要的意义。

下面将分别介绍该软件体系结构下的主程序-子程序软件体系结构与面向对象软件体系结构。

6.1.3主程序-子程序软件体系结构

主程序-子程序软件体系结构在设计上使用层次化的划分方法,该体系结构中使用由编程语言直接支持的单一的控制线程。

子程序的结构是明确的,子程序通常组成程序模块。

子程序的调用呈现层次状,其正确与否往往取决于其调用的子程序的正确与否。

主程序-子程序软件体系结构图如吐6.3所示。

 

 

图6.3共享数据的在主程序-子程序软件体系结构

和非结构编程比较,主程序-子程序软件体系结构能够较好地支持系统的可改变性及可伸缩性等性能。

由于该体系结构采用了分而治之策略,将一个复杂问题分解为多个独立的子问题,从而实现了对系统分复杂度的有效控制。

C语言开发程度即属于典型的主程序-子程序风格的软件体系结构。

C语言开发的程序通常包括一个main函数(即主程序)和一些自定义的函数(即子程序)。

主程序-子程序体系结构中典型地存在一个控制线程,每个阶层的组件从其父组件得到该控制并且通过它传给它的子组件。

使用主程序-子程序软件体系结构的设计通常采用如图6.4所示的自顶向下的功能化设计方法。

 

图6.4自顶向下的的功能化设计方法

自顶向下功能化设计方法的设计思想是,系统从功能的角度进行设计,从高层开始,逐步细化为详细的设计。

该设计从系统要完成的功能需求出发,首先将一个整体问题(功能)分为几个子问题(子功能),然后再考虑将每个子问题(子功能)再次划分为几个更小的子问题(子功能),依次下去,直到不可再分为止。

通过这样的设计,得到一颗如图6.4所示的根朝上的树形结构,其中,每个节点都是一个子程序。

可以理解为系统的功能可以由多个子程序完成。

高层子程序调用低层子程序,而低层主程序又调用比它更低的子程序,等等。

结构化程序设计得到了广泛的应用,例如阿波罗11号的地面控制系统的子系统ApolloReentryRunge–Kutta数值集成器软件采用结构化程序设计,利用FORTRAN语言开发,在当时最快的计算机IBM360-75上运行。

结构化设计从数据流图开始,然后将数据流图转换为程序结构图(StructuredChart)。

设计数据流图从数据输入开始,对数据的各个处理过程以及最后的输出进行描述;将提供给用户的业务流程图(”物理模型”)进行功能建模,转化成开发人员更易理解的一系列”逻辑模型”图,以图形化的方法描绘数据在系统中的流动和处理过程。

这些图需要用规范的DFD描述,达到系统在建立前有关信息就能被充分理解的目的。

在设计时要求严格划分开发阶段,用规范的方法与图表工具精确的描述各阶段的工作,每个阶段都以规范是哪个的文档资料作为其成果,最终得到满足用户需要的系统。

相对于非结构化的设计,结构化设计有以下优点。

(1)逻辑设计与物理设计分开。

(2)开发过程中形成一套规范的文档,以便后期修改和维护。

结构化设计的缺点为开发周期长,系统难以适应环境的变化以及开发过程复杂繁琐。

结构化设计适用于组织相对稳定、业务处理过程规范、需求明确且在一定时期内不坏发生大的变化的大型复杂系统的开发,经验表明,当程序小于10万行时,结构化的程序设计比较成功。

当程序大于10万行时,结构化程序表现不加,原因是当程序规模非常大时,程序代码编写耗时长,软件测试变得越来越困难,难以保证软件的可靠性。

自顶向下的程序设计方法存在如下问题。

(1)功能烟花困难。

自上而下的方法穿件了符合最初的需求的较好的软件系统模型。

但是当系统改变或者增加新的需求是,功能结构变得越来越笨拙。

由于软件被设计为树形结构,修改与更新,通常要求广泛的“剪枝”与“嫁叶”,使系统维护变得越来越困难。

(2)现实中的系统功能不容易描述。

大型加护系统很难从功能方面进行刻画。

很多大型系统没有“顶部”,例如,一个涉及数据查询、数据改变与保持数据一致性的软件系统,如果按照功能化自向下的设计,则该系统可能被设计为一个基于一个唯一的“虚拟”顶点并且会产生非常复杂的结构。

(3)功能化设计丢掉了数据与数据结构。

自顶向下设计中捕捉不到所设计软件涉及的数据,通常,同样的数据被多个函数共享(如更新、删除、插入和询问数据库表)。

因为系统分解只突出问题的功能方面,数据结构对问题的影响被丢失了。

(4)由于功能设计得到的软件产品产生的可复用代码较少。

自顶向下的设计连续不断的将系统分为越来越简单的程序模块。

每个程序块被单独地分析确认,没有太多地考虑系统的其他部分。

但是每个程序单元的设计都仅仅考虑极为有限的需求,因为这些特定的需求不太可能出现于下个问题,所以产生的设计与代码没有普遍性与通用性,从而通常不可复用。

6.1.4面向对象的软件体系结构

在结构化设计以及编程中,简单的程序可以由一个主程序中的一系列语句组成的一个较长的文件代表,而在负载的程序中,通过子程序或者函数执行一些特定的任务。

通常情况下,程序中的数据可以被程序的任何语句或者函数访问,当程序很大时,这种做法意味着一个程序缺陷(bug)可能被传导到很远,导致程序难以调试和维护,另外,如果想在程序中添加一些新的功能也比较困难,因为用户必须清楚哪些函数对哪些数据进行了访问与修改。

相反,面对对象设计与编程方法可以使程序员将数据封装起来,使数据访问受到限制,也就是说数据不能被程序的其余部分不加限制的直接访问。

任何一个函数都必须通过一个特殊的方法才能访问这些数据,该方法与数据一起被封装在一个结构体中。

这种将数据与一系列访问与管理这些这些数据的方法结合在一起的结构体实际上就是本接种要介绍的对象(Object).

可以认为,一个对象是将数据与那些为了访问和维护这些数据的操作(即函数方法)捆绑在议案七的一个实体,对象提供了一些简单易使用的、规范化的方法对其数据进行某种操作,而隐瞒了其具体的执行任务的繁琐细节,这样做的好处是,可以改变对象的内部结构或方法,而不需要修改程序的其余部分。

在面向对象设计中,系统看做由一些对象的集合组成(而不是由函数或者方法组成),消息从一个对象发送到另外一个对象,每一个对象都有其相关功能。

面向对象体系结构图如图6.9所示。

 

图6.9面向对象的体系结构图

1.对象与类的定义

面向对象的设计是在1972年由Parnas提出的,对象和类是面向对象设计的基本要素。

软件系统的开发者创建类来代表系统的每个构建。

这些通用的类被用来创建程序中所需要的每个对象的特定实例。

对象可以通过使用方法互相进行交互。

在类的实例没被创建以前,对象是不存在的,类仅仅是定义。

当一个对象被具体的创建以后,随机存储器将会为该对象分配内存空间。

一个类可以产生多个对象。

在C语言中哟若干原始数据类型,如float、int、char等,代表一些特定的数据类型。

面向对象设计与面向对象编程(OOD/OOP)将原始的数据类型扩展到更高层次的对象。

一个对象可以封装包括原始数据类型在内的各种数据类型。

在面向对象的设计与编程的书籍中,有很多对象与类的定义。

下面给出常用的对象与类的定义。

一个对象是一个具有的状态(State,即包含数据)与行为(Behavior,如C++中的函数、Java中的方法)的实体。

一个对象存储它的状态在域(例如通过Java类中的变量)中,并且通过方法(例如C++函数或者Java方法)暴露它的行为。

方法对其所在对象的内部状态进行操作,并且是对象之间交流的主要机制。

面向对象设计隐藏对象的内部状态。

并且要求所有对象之间的交互都通过该对象方法,这叫做数据封装,是面向对象编程的基本原则。

在面向对象设计与编程中,一个类是一个结构体,使用该结构体可以产生该类的对象。

一个类描述了使用该类创建的对象的共有状态与行为。

一个类的对象也可以被称为该类的实例。

2.面向对象设计的特点

面相对象设计具有以下特点。

(1)封装性(Encapsulation):

限制对特定信息的访问,例如,在Java中的私有属性。

这些数据被封装在对象里面,只有通过该对象的特定方法才能访问这些数据。

(2)继承性(Inheritance):

共享同一个功能定义,例如通过Java类的继承获得超类的功能。

继承性是一个对已经存在的类的复用的重要手段。

(3)动态绑定性(DynamicBinding):

通常在使用一个人层次类的时候,声明一个超类类型的变量,在程序运行以前,不知道创建哪个类的对象,而只是在运动时才动态决定要生成的子类的对象和调用那个操作(方法或函数)。

动态绑定是面向对象程序设计的重要特点之一。

(4)复用与可维护性(ReuseandMaintenance):

这是因为采用了封装与局部化。

(5)对象是对现实世界的抽象并且可以自己管理自己。

对象中包含了数据与管理这些数据的方法。

(6)系统功能通过对象服务表示:

对象的借口提供了一系列的方法,包括方法名、参数类型。

在整个软件系统中有很多对象,每个对象所提供的方法提供了一些服务。

整各系统的功能通过所有的类提供的方法完成。

(7)共享数据区域被取消:

在数据共享的主程序-子程序体系结构中,共享数据通常是全局变量。

而在面向对象设计中,所有的数据都被封装在各个类之中,因此不存在全局变量。

也就是说,没有共享数据存在。

(8)对象可以是分布的:

分布的对象通常指的是设计在一起工作的软件模板,但是位于被网络连接在一起的的多台计算机中或者在同一台计算机的不同过程中。

一个对象发送消息给一个远程计算机中的另一个对象或者过程,执行某一任务。

执行结果可以被传回到调用的对象。

对象通过函数或者方法调用互相交互,如图6.12即为两个类交互的示例。

Key

+open(Locklk):

void

Key

+lock(Doord):

void

图6.12两个类交互的示例

为了实现两个类之间的交互,在应用程序中可以按照如下的代码顺序创建锁对象和钥匙对象,并且钥匙对象调用自己的open方法进行开锁。

3.面向对象编程的继承机制

在面向对象的编程技术中,继承是使用已经被定义了的类似以便形成新的类的一种法。

例如,图6.13为一个类的继承的实例。

 

图6.13一个类的继承的实例

新的类(又叫派生类或者子类)继承其超类的已经存在的类的属性和行为。

继承的主要目的是复用现有的代码。

子类可以从其超类继承到属性与操作。

除此之外,子类号可以拥有属于自己的属性与操作。

注意,在Java语言中,子类不可以直接访问其超类的private变量,但是可以直接访问超类的protected和public类型的变量。

继承:

提供了一个统一的借口,使得多态与动态绑定很容易实现。

但是,继承可能会增加复杂度。

4.面向对象设计的优缺点

面向对象设计具有如下优点。

(1)容易维护:

因为一个对象将其内部表示对客户程序隐藏起来,所以可以改变其内部实现而不影响那些客户程序。

(2)可复用性好:

对象为适合复用的构建。

(3)映射现实世界:

对于许多软件系统都存在明显的现实世界的实体到系统的对象。

例如,在一个赛马管理软件系统中出现的Horse类,封装了赛马的名字、颜色、年龄、性别等,就是对赛马现实世界的模拟。

(4)容易对一个系统进行剖分:

面向对象设计将数据与数据访问、操纵方法绑定在一起形成类,由类产生对象。

使得软件设计者将整个问题剖分为一系列的互相交互的对象集合。

例如,在游戏软件中,每个角色都可以使用一个对象来代表,所以整个系统可以较为容易地剖分成例如Hero类与Monster类。

面向对象设计具有如下缺点。

(1)面向对象程序占用内存较大。

这是因为在程序运行中,每个新被创建的对象都必须占用一块内存,而在面向对象程序中,往往有大量的对象被创建。

因此和结构化设计产生的程序相比较,面向对象程序占用内存更多。

(2)一个对象要和另外一个对象交互,该对象都必须知道另外一个对象的身份,包括对象名、方法名和参数类型等。

6.2数据流风格软件体系结构

使用主程序-子程序与面向对象架构设计的程序由多个组件构成,组件之间通过相互调用实现系统的整体功能。

与上述架构不同,本节要介绍的数据流风格体系结构中的组件通常是互相独立的,不存在一个组件调用另外一个组件的现象。

程序的运行有数据流控制,这种体系结构被广泛地应用在数据处理软件领域。

本节首先介绍数据流系统(DataflowSystem)的定义及基本特点,然后介绍两种典型的数据流风格体系结构,即顺序批处理体系结构(BatchSequentialArchitecture)和管道-过滤器体系结构(Pipes-and-FiltersArchitecture)。

6.2.1数据流系统与数据流风格软件体系结构概述

数据流系统是一个软件系统,在该系统中,数据的可用性控制计算(数据处理过程),过程间的数据有序流动决定了系统的结构。

数据的流动方式是明确的。

在数据流系统中,一般情况下,数据可以任意方式流动,这样的数据流系统通常比较复杂。

人们感兴趣的往往是相对简单的数据流动方式,,如近似线性的数据流动方式

(如图6.16所示)以及带有环形的流动方式(如图6.17所示)。

 

图6.16数据流系统中的近似线性的数据流动方式

 

 

图6.17数据库系统中的带有环形的数据流动方式

数据流系统的各软件组件在无数据到达时处于休眠状态,当有数据到达时,该软件组件被激活,开始对数据进行处理。

软件工程师关心的是程序中控制流的轨迹。

数据可以伴随着控制,但是数据不处于控制地位,重要的是程序的执行顺序。

在系统设计中,人们关注数据是怎样流动的,关心数据的可用性、变幻与延迟。

数据流风格软件体系结构将整个软件系统看做由一系列作用在连续数据集合上的“变幻”组成。

数据和作用于其上的操作是互相独立的。

软件系统被分解为一些数据处理单位或称为组件,数据流控制数据处理顺序。

在纯数据流系统中,过程间无其他的互动。

数据流系统架构中的组件将其输入数据“变换”为对应的输出数据。

可以使用I/O流、I/O文件、缓冲(Buffer)、管道流,或者其他连接类型来实现子系统组件之间的连接。

数据流风格软件体系结构应用于定义明确的一系列带有有序输入与输出的独立数据变换,数据传输可以是整块的数据传输或者以数据流的形式进行。

这些处理都不需要用户/系统交互。

典型的实例是商业数据处理和编译器。

在数据流风格体系结构中,组件是高度独立的,不存在全局控制组件的行为。

处理单元可以并发工作,甚至是在不同的计算机上并发工作,这个特点使其可以处理连续的流数据。

数据流风格体系结构中的组件是可以被重复使用的,且在保证输入与输出接口都不变的情况下,可以独立修改一个组件,而不影响其他组件。

在实现数据流风格软件体系结构的软件时,需要特别注意组件之间的同步(Syncronization)问题。

6.2.2顺序批处理软件体系结构

顺序批处理数据流系统(BatchSequentialDataflowSystem)是数据流风格体系结构的一个类型。

在该系统中,组件为独立的程序,并且这些组件按照先后顺序处理,即只有当一个组件的运行彻底结束以后,下一个组件才能开始执行。

可以认为,数据在处理步骤之间的传输是成批(块)的,而不是以数据流的方式进行的。

这也是“顺序批处理”名称的由来。

历史上,曾采用传统顺序批处理数据流系统进行数据处理。

例如,在大型机年代,某些企业的商业数据处理可能采取顺序批处理的方式。

原始数据被录制在数据卡片上,数据处理的步骤如图6.18所示。

 

传统的顺序批处理数据处理系统原理如图6.19所示。

其主要特点是整个系统被分为多个处理过程(图中P1、P2、P3),各处理过程为独立的程序模块,每个处理过程都通过磁带或者磁盘进行输入与输出。

 

批处理系统具有如下特点。

(1)每个处理程序模块都是互为独立的程序。

(2)只有上一步程序彻底执行完成了,下一步程序才能开始。

(3)数据作为一个整体进行传输。

(4)因为以上的特点,所以不必对其组件进行同步处理。

(5)因为几个组件只能按照顺序执行,而不能同步执行,所以性能可能比那些能按照几个组件同时运行的程序要差一些。

(6)使用顺序批处理架构设计的软件不适用于要求对数据进行实时处理的系统。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2