`
sailorlee
  • 浏览: 41477 次
  • 性别: Icon_minigender_1
  • 来自: 河北唐山
最近访客 更多访客>>
社区版块
存档分类
最新评论

系统的层次划分

阅读更多

1.简述

N层的应用软件系统,由于其众多的优点,已经成为典型的软件系统架构,也已经为广大开发人员所熟知。在一个典型的三层应用软件系统中,应用系统通常被划分成以下三个层次:数据库层、应用服务层和用户界面层。如下图(图2.1)所示:

2.1

其中,应用服务层集中了系统的业务逻辑的处理,因此,可以说是应用软件系统中的核心部分。软件系统的健壮性、灵活性、可重用性、可升级性和可维护性,在很大程度上取决于应用服务层的设计。因此,如何构建一个良好架构的应用服务层,是应用软件开发者需要着重解决的问题。

为了使应用服务层的设计达到最好的效果,我们通常还需要对应用服务层作进一步的职能分析和层次细分。很多开发者在构建应用服务层的时候,把数据库操纵、业务逻辑处理甚至界面显示夹杂在一起,或者,把业务逻辑处理等同于数据库操纵,等等,这些,都是有缺陷的做法。我们将就在这个方面进行设计时可采用的方案进行一些探讨。

在一个分布式应用系统中,整个系统会部署在不同的物理设备上,如上面所示的三层体系,用户界面和应用服务器可能在不同的设备上,这就涉及到不同机器之间的通信问题,也就是层间的通信和交互问题。我们已经有了很多可以用于分布式远程访问的技术,如CORBA,在Java平台上,我们还有Java RMIEJB,在Windows平台上,从DCOMCOM+,再到.Net下的Web Service.Net Remoting等。如何选用合适的远程访问技术,也是我们在系统框架中需要考虑的问题。

  为了使讨论更具有针对性,本文也会讨论一些比较流行的系统架构,例如J2EE架构,以及JDO,然后,我们会讨论Websharp在这个方面的一些设计理念。

2.设计的原则和评判标准

  同软件工程的原则一样,应用服务层的设计,必须遵循的最重要的原则就是高内聚和低耦合。软件分层的本来目的,就是提高软件的可维护性和可重用性,而高内聚和低耦合正是达成这一目标必须遵循的原则。尽量降低系统各个部分之间的耦合度,是应用服务层设计中需要重点考虑的问题。

  内聚和耦合,包含了横向和纵向的关系。功能内聚和数据耦合,是我们需要达成的目标。横向的内聚和耦合,通常体现在系统的各个模块、类之间的关系,而纵向的耦合,体现在系统的各个层次之间的关系。

  系统的框架,通常包含了一系列规范、约定和支撑类库、服务。

  对于如何判断一个软件的系统框架的优劣,笔者认为,可以从以下几个方面来评判:

   系统的内聚和耦合度

  这是保证一个系统的架构是否符合软件工程原则的首要标准。

   层次的清晰和简洁性

  系统每个部分完成功能和目标必须是明确的,同样的功能,应该只在一个地方实现。如果某个功能可以在系统不同的地方实现,那么,将会给后来的开发和维护带来问题。

  系统应该简单明了,过于复杂的系统架构,会带来不必要的成本和维护难度。在尽可能的情况下,一个部分应该完成一个单独并且完整的功能。

   易于实现性

  如果系统架构的实现非常困难,甚至超出团队现有的技术能力,那么,团队不得不花很多的精力用于架构的开发,这对于整个项目来说,可能会得不偿失。简单就是美。

   可升级和可扩充性

  一个系统框架,受设计时技术条件的限制,或者设计者本人对系统认识的局限,可能不会考虑到今后所有的变化。但是,系统必须为将来可能的变化做好准备,能够在今后,在目前已有的基础上进行演进,但不会影响原有的应用。接口技术,是在这个方面普遍应用的技巧。

   是否有利于团队合作开发

  一个好的系统架构,不仅仅只是从技术的角度来看,而且,它还应该适用于团队开发模型,可以方便一个开发团队中各个不同角色的互相协作。例如,将Web页面和业务逻辑组件分开,可是使页面设计人员和程序员的工作分开来同步进行而不会互相影响。

   性能

  性能对于软件系统来说是很重要的,但是,有的时候,为了能让系统得到更大的灵活性,可能不得不在性能和其他方面取得平衡。另外一个方面,由于硬件技术的飞速发展和价格的下降,性能的问题往往可以通过使用使用更好的硬件来获得提升。

3.应用服务层的内容

  应用服务层,通常也被称为业务逻辑层,因为这一层,是应用软件系统业务逻辑处理集中的部分。然而,我将这一层称为应用服务层,而不称业务逻辑层,因为,这一层需要处理的不仅仅是业务逻辑,还包含了其他方面的内容。

  从完整的角度来说,应用服务层需要处理以下内容:

   数据的表示方式

  数据,是软件处理的对象。从某种程度上来说,"软件,就是数据结构加算法"的说法,是有一定意义的。在面向对象的系统中,数据是用类来表示的,代表了现实世界实体对象在软件系统中的抽象。考虑所谓的MVC模式,这个部分的类属于M--实体类的范畴。由于应用软件通常会使用数据库,数据库中的数据,可以看成是对象的持久化保存。由于数据库一般是关系型的,因此,这个部分,还需要考虑类(对象)同关系型数据的映射,即通常所说的O-R MAP问题。

   数据的存取方式

  如同上述所说,软件系统处理的实体对象数据需要持久化保存数据库中,因此,我们必须处理系统同数据库的交互,以及数据的存取和转换方式的问题。

   业务逻辑的组织方式

  在面向对象的系统中,业务逻辑表现为对象之间的交互。有了上述的实体对象,以及对象的保存策略,就可以将这些对象组合起来,编写我们的业务逻辑处理程序。在业务逻辑的处理中,必须保证处理的正确性和完整性,这将会涉及到事务处理。通常,我们也会把业务逻辑封装成组件的形式,以得到最大的可重用性。

   业务服务的提供方式

  在我们完成系统的功能后,如何向客户提供服务,是我们需要考虑的问题。这里的客户,不仅仅是指软件的使用者,也包括调用的界面、其他程序等。例如,在一个基于WebASP.NetJSP系统中,业务逻辑功能的客户便是这些ASP.Net页面或JSP页面。业务逻辑组件应该通过什么方式,直接的,或间接的,向这些客户提供服务,是这一层需要完成的任务。

   层的部署和层间交互

  对于一个多层的应用软件系统来说,尤其是大型的应用软件系统,通常需要把不同的部分部署在不同的逻辑或物理设备上。特别是一些基于Web的应用软件系统,其部署工作将涉及到Web服务器、组件服务器、数据库服务器等不同的服务设备。在进行应用软件架构的设计的时候,必须考虑各种不同的部署方案。 当系统需要进行分布式访问的时候,如何统一和简化分布式系统的开发,便成了系统框架需要考虑的内容。

  综上所述,一个完整的基于Web的应用软件系统,其架构可以用图2.2来表示(Websharp的应用软件系统架构):


2.2

对于以上各个方面来说,每个问题都可以有很多种策略和方案,但是,在一个系统中,应该尽可能的统一这些策略和方案。也就是说,在一个系统,或者一个项目中,应该统一每个解决每个问题所采用的方法。软件的开发方法是灵活的,可以用不同的方法解决相同的问题,这会诱使开发人员采用他们认为能够表现自己的方法,但是,从整个系统来看,这将会是灾难性的。我们应该尽可能统一,就是,采用统一的数据表示方式、统一的数据存取方式、统一的业务逻辑处理方式等。

下面,将就这些部分的设计策略和可用方案进行一些比较详细的论述。

4.数据实体的表示

  应用软件系统,从本质上来说,是计算机对现实世界的模拟。现实世界中的实体对象,在软件系统中,表现为需要处理的数据。在面向对象的系统中,这是通过"""对象"来表示的。

  参考著名的"MVC"模式,类可以分成实体类(M)、控制类(C)、和边界类(V),分别代表了实体对象、控制和界面显示。系统中需要处理的数据,在面向对象的系统中,属于实体类部分。

  在考虑数据实体层的设计策略的时候,需要把握以下要点:

   一致的数据表示方式。在一个系统中,数据的表示方式必须尽可能统一,同时,在处理单个数据和多个数据的时候,处理方式尽可能一致。

   因为数据通常是需要存储到数据库中,因此,良好的映射方法是必需的。

   处理好对象的粒度,即所谓的粗粒度对象、细粒度对象。

  一般例子

  考虑一个现实的例子,一个仓库中的产品(Product),在系统中可以使用如下定义:

 

public class Product

{

     public string Name;  //名称

     public decimal Price;//价格

     public int Count;//数量

}

可以按照如下方法使用Product类:

Product p=new Product();

  //……处理Product

  这是一个包含了三个属性的Product类的定义。为了便于说明,在这里,我们尽量将问题简化了。

  又例如,一张入库单可以使用如下定义:

public class Form

{

     public string ID;               //入库单编号

     public DateTime AddTime;      //入库时间

     public FormDetail[] FormDetails;  //入库单明细

}

public class FormDetail

{

     public Product InProduct;       //入库产品

     public int Count;              //入库数量

}

  对于处理单个对象,通常采用上述的方法,但是,当我们需要处理相同类的一组对象,也就是处理一个对象集合的时候,就会有一些小小的麻烦。

  如前所述,我们希望在处理单个对象和对象集合的时候,处理的方式尽量统一,这对于软件开发的意义是很大的。常用的处理对象集合的方法有:

  数组表示的方法

  例如,上面的例子中当一张入库单包含多条入库单明细的时候采用的方法。为了灵活性,也可以使用容器来,如Java中的VectorC#ArrayList(C#)。只是,在处理对象的时候,需要一个类型转换的操作。这个问题,在支持泛型的语言中不会存在,如使用C++的标准库的容器类。

  ObjectCollection方法。这个方法同上面的方法类似,不同之处在于,为每个实体类设计一个Collection类。例如,可以为FormDetail设计一个FormDetailsCollection(C#)

public class FormDetailsCollection: ArrayList

{       

     public void Add(FormDetail detail)

     {

         base.Add(detail);

     }       

     public new FormDetail this[int nIndex]        

     {            

         get

         {

              return (FormDetail)base[nIndex];

         }   

     }

}

 

  这么做的好处在于,在操作集合中的对象时,不必进行类型转换的操作。

  数据集的表示方法。

  采用这种方法,通常是直接把从数据库查询中获取的数据集(Recordset)作为数据处理对象。这种方法在ASP应用程序中是非常常见的做法。这种做法简单,初学者很容易掌握,但是他不是一种面向对象的方法,弊病也很多。

  EJB的方法

  在J2EE体系中,对实体对象的处理的典型方法是Entity BeanJ2EE中使用Entity Bean来表示数据,以及封装数据的持久化储存(同数据库的交互)。由于Entity Bean比较消耗资源,而且采用的是远程调用的方式来访问,因此,在需要传递大量数据,或者在不同的层次之间传递数据的时候,往往还会采用一些诸如"值对象"(Value Object)的设计模式来提升性能。关于J2EE中的设计模式的更多内容,读者可以参考《J2EE核心模式》一书。

  JDO的方法

  相对于J2EE这个昂贵的方法来说,JDO提供了一个相对"轻量级"的方案。在JDO中,你可以采用一般的做法,编写实体类,然后,通过一些强化器对这些类进行强化,以使其符合JDO的规范,最后,你可以通过PersistenceManager来实现对象的持久化储存。

  无论是EJB还是JDO,在同数据库进行映射的时候,都选用了XML配置文件的方式。这是一种灵活的方式。由于XML强大的表达能力,我们可以很好的用它来描述代码中的实体类和数据库之间的映射关系,并且,不用在代码中进行硬编码,这样,在情况发生变化的时候,有可能只需要修改配置文件,而不用去修改程序的源代码。关于EJBJDO的配置文件的更多的信息,各位可以参考相关的文档,这里不再赘述了。

  然而,使用XML配置文件的方式并不是唯一的方法,在微软提供的一些案例中,如Duwamish示例,就没有采用这种方式。至于开发人员在开发过程中具体采用哪种方式,是需要根据具体情况进行权衡和取舍的。

  Websharp的方法

Websharp在数据的表现上,充分利用了.Net Framework类库中DataSet和特性(Attribute)的功能。我们设计了一个EntityData类,这个类继承了DataSet,并增加了一些属性和方法。

Websharp中,当表示一个实体类的时候,需要定义一个抽象类,这个抽象类继承PersistenceCapable。例如,一个Schdule类可以表示如下:

     [TableMap("Schdule","GUID")]    

     [WebsharpEntityInclude(typeof(Schdule))]

     public abstract class Schdule : PersistenceCapable

     {

         [ColumnMap("GUID",DbType.String,"")]

         public abstract string GUID{get;set;}    

        

         [ColumnMap("UserID",DbType.String,"")]

         public abstract string UserID{get;set;}       

        

         [ColumnMap("StartTime",DbType.DateTime)]

         public abstract DateTime StartTime{get;set;}      

        

         [ColumnMap("EndTime",DbType.DateTime)]

         public abstract DateTime EndTime{get;set;}        

        

         [ColumnMap("Title",DbType.String,"")]

         public abstract string Title{get;set;}        

        

         [ColumnMap("Description",DbType.String,"")]

         public abstract string Description{get;set;}      

        

         [ColumnMap("RemidTime",DbType.DateTime)]

         public abstract DateTime RemidTime{get;set;}      

        

         [ColumnMap("AddTime",DbType.DateTime)]

         public abstract DateTime AddTime{get;set;}        

        

         [ColumnMap("Status",DbType.Int16,0)]

         public abstract short Status{get;set;}        

     }       

类的TableMap 特性指明了同Schdule实体类相映射的数据库表,以及关键字,ColumnMap特性指明了同某个属性相映射的数据库表字段,以及数据类型和默认值。

分享到:
评论

相关推荐

    电子文档管理系统的设计与实现.

     本文首先对‘电子文档管理系统’的概念、作用及典型应用进行了介绍,然后详细介绍了电子文档管理系统的系统层次划分及接口设计与实现,并介绍了电子文档处理的一些关键技术,说明了电子文档管理系统是如何对现代...

    操作系统概念(英文第七版).分为四部分.part3

    操作系统概念(第七版).英文原版,供大家学习~

    网上书店课程设计

    2.3 系统层次划分 4 2.4系统数据流程图 5 2.5数据字典 5 第三章 系统总体设计 8 3.1 系统总体设计目标 8 3.2系统概念设计 8 3.2.1概念模型(E-R图) 8 3.2.2关系模式 11 第四章 数据库系统实现 12 4.1数据库实现...

    论文研究-基于Lucene的电子文档管理系统的设计与实现 .pdf

    基于Lucene的电子文档管理系统的设计与实现,王文正,赵乐方,文中首先对电子文档管理系统的概念、作用及典型应用进行了介绍,然后详细介绍了电子文档管理系统的系统层次划分及系统思想所用的

    网络系统集成与工程设计2

    项目的概念,网络项目管理,项目管理机构的责任,项目团队的组织。 网络系统集成需求分析,完整的需求调查文档记录,撰写网络系统集成描述书。...网络物理拓扑结构,网络系统层次划分,服务器布置策略。

    基于层次分析法的电力系统等值的区域合理划分.pdf

    基于层次分析法的电力系统等值的区域合理划分.pdf

    循环农业层次性划分研究

    循环农业层次性划分研究,冯永忠,杨改河,层次性是指导循环农业经济的主要特征,对指导不同层面循环农业的发展具有重要的作用;本文以农业生态系统、农业经营体制和农业市

    基于SOA 的水利枢纽信息系统的功能划分与层次设计

    本文分析了我国目前水利枢纽信息系统集成中存在的问题,...集成设计中的作用,提出了基于SOA 的水利枢纽信息系统设计层次,表明了充分用已有的 信息系统,复用现有的服务,进行基于SOA 的水利枢纽信息系统集成的优势。

    液压挖掘机多层次的模块划分方法

    分析了履带式液压挖掘机模块划分背景和特点,通过对它进行功能分解,建立起了功能树,结合复杂产品在功能系统上有层次性的特点,对液压挖掘机介绍了一种基于功能分解的多层次的模块划分方法,并以底盘总成为例,进行多层次...

    论文研究-GPLP:基于标签传播的大图多级划分算法.pdf

    目前可用的划分算法可分为随机划分和多层次划分,已有的算法难以在划分速度和划分效果两个方面同时满足要求。提出了一种新的基于标签传播的多级划分算法GPLP,该方法将图划分过程分为数据标记、图粗糙化和数据迁移三...

    可达性矩阵的级别划分问题

    系统工程原理里用到的一个原理用C++编写的,对一个矩阵进行级别划分。

    一种基于层次聚类的子系统划分方法研究

    一种基于层次聚类的子系统划分方法研究

    数据库系统安全框架与其各层安全技术

    数据库系统的安全除依赖自身内部的安全机制外,还与外部网络环境、应用环境、从业人员素质等因素息息相关,因此,从广义上讲,数据库系统的安全框架可以划分为三个层次:网络系统层次;宿主操作系统层次;数据库管理...

    煤矿生产系统集成的层次结构及其标准化问题研究

    从数字化、信息化、自动化、智能化和标准化等角度综述了新技术对煤矿生产系统的促进作用,分析了煤矿生产系统集成的体系结构,划分了系统的层次,描述了各层次解决的主要问题和服务内容,初步确立了系统集成的框架,特别...

    数据库系统的安全框架及各层安全技术

    数据库系统的安全除依赖自身内部的安全机制外,还与外部网络环境、应用环境、从业人员素质等因素息息相关,因此,从广义上讲,数据库系统的安全框架可以划分为三个层次:⑴网络系统层次;⑵宿主操作系统层次;⑶...

    数据库管理中防黑客入侵技术概述

    文中还以在DBMS外层实现加密功能的原理为例,详细说明了如何应用数据库管理系统层次的安全技术。 数据库系统安全框架的三个层次是相辅相承的,各层次的防范重点和所采取的技术手段也不尽相同,一个好的安全系统必须...

    图书馆管系统 数据库课程设计(含源代码和详细的实验报告)

    这里把系统的层次划分为了四个部分:图书维护,人员信息管理,图书借阅管理,信息查询。能够实现以下功能: 1、进行新书入库、现有图书信息修改; 2、能够实现对读者基本信息的查询和编辑管理; 3、能够进行超期罚款...

    数仓主题域与主题划分及其案例分析

    数仓主题 :是在较高层次上将企业生产上的各个系统中某一分析对象 的数据进行整合、归类并分析的一种范围,属于一个 抽象概念,简单点说每一个主题对应一个宏观分析领域。 划分方法 :说白了主要就是要识别出分析...

    基于Java+MySQL实现医院管理系统【100012375】

    这里把系统的层次划分为了五个部分:收费系统、报表系统、库存管理、维护系统.能够实现以下功能: 收费系统能能够提供收费开票、退款服务、发票查询服务. 报表系统能够将当班信息报表、收费工作汇总报表呈现给组长. ...

    两个互联网软件系统概要设计文档模板.zip

    不同的系统类型其概要设计的内容也不相同,通过概要设计准则我们可以根据实际情况确定概要设计的具体...层次划分的方法可以结合业务、部署、运用功能等因素考虑,首先进行分类,然后进行抽象分析,整理共性要素,将功

Global site tag (gtag.js) - Google Analytics