第1章
C/S应用框架介绍
内容简介:
基于框架来开发具体的应用系统已然是软件开发的主流模式,比如基于CORBA/ORB、J2EE/EJB、DCOM等来开发工业级和企业级分布式应用软件系统,基于ACE来开发复杂的应用服务器软件,基于MFC框架来开发Windows窗口类应用软件,等等。通用框架以及某类应用系统的应用框架,对应用系统软件的设计和开发的影响无疑是巨大的,好的影响当然是可以减少工作量、提高开发效率和缩短开发周期,以及构建的系统更加健壮和可扩展;不好的影响则是开发人员必须强迫自己接受这些框架倡导的一些思想、抽象概念、方法以及工具,并且通常需要经历较长时间的学习和实践过程,即使有专门的培训也不见得短期内就能够掌握,所以要想熟练运用就需要开发人员付出额外的努力。
本章将首先简单地阐述一下应用框架的概念及其优点,然后具体介绍C/S(客户机/服务器)类型的应用系统常用的且比较著名的几个应用框架和技术,包括CORBA、DCOM和ACE,最后阐述它们各自的特点和优缺点。本章将作为第二章“基于消息驱动的通用C/S应用框架设计和实现”的背景和铺垫。
1.1 什么是应用框架
1.2 C/S模型的演变
1.3 CORBA分布式面向对象体系结构
1.4 COM/DCOM
1.5 ACE架构
1.1 什么是应用框架
为什么要开发和使用应用框架呢?这是因为某些类型的应用软件都具有一些基本的需求、特性以及方法,如需要人机交互界面、文件读写、网络通信、事件处理、打印输出等等;再如某些领域(比如金融、电信、保险、医疗卫生、石油化工等)的应用软件系统也有各自共同的需求,除了人机界面、网络通信等基本需求外,还需要通信安全性、跨平台可移植、事务服务、并发服务以及构件可分布性和动态迁移性,等等。如果将这些共性提取出来并加以整合,然后实现为某类应用软件的通用框架,就可以在此类应用系统的开发中重用这些框架,这将极大地简化日后此类应用软件的开发工作、减少工作量和加快开发速度,同时可提供统一的和标准化的软件解决方案。额外的好处当然是编写出来的软件具有统一的架构、统一的风格和模式,可维护性和可扩展性将更好,而且由于框架必然要经过千锤百炼,所以基于这样的框架编写出来的程序将更加健壮(即使出现Bug也多是从你自己编写的代码中冒出来的J)。
一般类型的应用程序虽然没有具体应用领域的软件那么多高级而复杂的需求,但也可以针对基本需求提炼出通用的框架,例如多媒体应用程序、经典的客户机/服务器(C/S)应用等。面向对象语言的出现(如Smalltalk、C++、Java等),使得应用框架的设计和实现成为可能,并且很快就出现和发展了大量的应用框架,比如针对网络服务类应用程序开发的架构有CORBA、J2EE和ACE等,针对一般窗口类应用程序开发的框架有MFC、OWL、OpenClass等,针对多媒体应用软件的框架有Microsoft的DirectX系列,等等。我们很多人即使没有使用过这些技术和应用框架,但也可能听说过。
那么到底什么是应用框架呢?它和类库有什么区别呢?什么样的类库才能称得上是应用框架呢?
从原理上说,一个应用框架致力于为一类应用程序提供统一的解决方案,它提供应用程序的基本结构、基本流程和骨架,但是需要用户按照一定的规则和模式来补充具体应用的细节。应用框架指定了面向对象架构中软件组件之间的关系、工作模式和接口。应用框架在最抽象一级上为某类应用建立通用模型,所以应用框架为用户提供的是一套架构、模式和规则。当然,应用框架几乎肯定是建立在一套类库的基础之上的,所以也可能会提供一些预定义好的通用组件,用户可以直接使用这些组件,或者也可以扩展它们。此外,应用框架还会解决一类应用程序的基本性和通用性的问题并提供相应的基础设施。
具体地讲,应用框架就是一组内聚性和逻辑性强、组织良好的类和类库,但是它并不包含实际的对象。框架中的类彼此关联或包含,并且彼此交互和合作,所以它们都不能单独使用,而必须共同重用。此外,用户不能修改框架中的任何类,而只能从框架中的基类派生出自己的具体应用类,当程序运行起来后由框架按需要自动创建这些类的对象并调用它们,或者由用户手工创建并调用它们,这符合共同封闭原则。
比如MFC,它不仅仅是个类库,它提供了对基于窗口的人机交互界面的Windows API的封装和面向对象的模型,提供了消息映射、分发和传递以及处理的框架,提供了对运行时对象类型识别(RTTI)和动态创建对象的支持,提供了数据持久化机制,提供了Document/View框架来支持数据处理和展示,以及对COM开发的支持等等,MFC提供了几组设计巧妙的宏来支持这些机制。此外,MFC还提供了基本控件封装、绘图支持、数据库访问支持以及Internet服务支持和一些基本的集合类等。MFC配合集成开发环境(IDE)中提供的向导工具就可以不费吹灰之力地制作出一个应用程序的初始框架代码。随着技术的不断发展,MFC还会加入更多的应用支持,并不断演变为更加完善和强大的工具。
再如CORBA,它致力于解决网络环境中异构平台上的不同应用程序之间的互操作性问题,它将这种互操作性抽象为CORBA对象的接口调用。它不仅规定了IDL接口标准以实现这种抽象的客户机和服务器之间的调用协议,还制定了GIOP协议来完成用各种语言实现的CORBA对象之间的消息传递,各种平台上的ORB实现更是屏蔽了底层硬件体系结构和操作系统以及网络协议的细节,确保应用层的代码具有最大的可移植性;而且它提供了很多公共服务如命名服务、安全通信服务、事务服务、事件通知、持久化服务等基础设施以及它们的访问接口。
而普通的类库中的类之间显然没有那么强的耦合性,大多数类可能彼此独立,无任何关系,只有少数的类之间存在一些简单或松散的耦合关系。比如C++ STL库中,容器和通用算法可以通过迭代器而在一起合作,但是具体一个容器类、一个算法和一个迭代器类之间却没有必然的关系;各种容器类之间也不存在任何关系;函数对象可用于通用算法,但是具体某个函数对象却和任何通用算法之间不存在耦合;等等。STL库中的各类组件之间是通过模板和标准接口适配在一起的,而不是耦合在一起的,所以它们可以独立发展。另外一些类库主要是解决某一类技术问题,而不是针对某一类应用软件开发的,比如数学类库、图形类库、XML文档解析类库等等。
最后,应用框架把程序员从一些通用的和公共的但却很繁琐的工作中解放出来,从而可以让他们把主要精力集中在应用层业务逻辑的设计和实现上,显著地提高生产率。近年比较著名的ACE就是这样的框架。