网站首页 公文大全 个人文档 实用范文 讲话致辞 实用工具 心得体会 哲学范文 总结范文 范文大全 报告 合同 文书 信函 实用
  • 毛泽东思想
  • 邓小平理论
  • 马克思主义
  • 三个代表
  • 百花范文网 > 哲学范文 > 邓小平理论 > [耦合性解耦策略研究]耦合与

    [耦合性解耦策略研究]耦合与

    时间:2020-02-29 07:58:29来源:百花范文网本文已影响

    (包头轻工职业技术学院  电子信息系,内蒙古 包头 014010)摘 要:文章通过分析面向对象软件耦合性度量框架,对面向对象系统的耦合关系进行了分类,利用降低耦合性的一些原则,并结合设计模式的思想,针对不同的耦合性提出了改善软件系统耦合性的解耦策略,使得软件各个模块之间尽可能保持松耦合,以便于软件的维护、理解和扩展。
    关键词:设计模式;
    耦合性;
    解耦策略
    中图分类号:TP311.52  文献标识码:A  文章编号:1007—6921(2008)05—0141—03

    随着人们对软件质量要求的提高,软件的设计和维护工作也受到了巨大的挑战。其中与软件质量相关的一个内部属性是耦合性。低耦合是软件设计的一个重要原则,而耦合性解耦策略的研究是保证软件低耦合的一个重要方面。
    1 研究目的

    在程序设计技术中,耦合性是指在一个软件结构中不同模块之间相互依赖的强弱程度,在面向对象的程序中,最基本的模块是类,因而面向对象系统的耦合性主要是指对象类之间相互依赖的强弱程度。在面向对象的程序设计中,耦合性的强弱会对系统产生一系列的影响:
    1.1 面向对象系统是由对象构成的,对象与对象之间的紧耦合会造成水波效应[1],即一个对象或模块的变化会导致其他对象或模块的相关变化,耦合性越高,则对设计其他部分的改变就越敏感。最坏的情况下,这种线性有可能波及到整个系统,从而导致整个程序的易理解性,可测试性、可靠性和易维护性急剧下降。因此,从程序设计的角度考虑,希望程序呈松耦合状态。
    1.2 随着软件复用技术的广泛应用,模块化设计和重用就显得越来越重要了[2]。在面向对象系统中,一个对象类越独立,那么它就越容易被重用到其他的应用程序中去。如果对象类间存在过多的耦合,那么将会对模块化设计和重用带来不利影响,因此在程序功能方面需要对象之间呈松耦合趋势。

    综上所述,在面向对象程序设计中,保证面向对象系统的松散耦合是面向对象程序设计成功与否的一个重要方面。本文通过分析面向对象软件耦合性度量框架,对面向对象系统的耦合关系进行分类,利用降低耦合性的一些原则,并结合设计模式的思想,针对不同的耦合性提出改善软件系统耦合性的解耦策略,使得软件各个模块之间尽可能保持松耦合,以便于软件的维护、理解和扩展。
    2 系统耦合性划分

    在面向对象度量技术中,耦合性的度量主要是从设计文档和源代码中进行静态分析、考察类的依赖关系,其中Eder等人提出了具有代表性的表征系统耦合性及其相对耦合强度的耦合性度量框架,即方法耦合、部件耦合以及继承耦合的三维耦合度量框架[2]。这个耦合框架从三个不同层次分析了面向对象系统的耦合机制,并根据Myers对结构化程序设计中耦合性的划分方法,对不同层次的耦合进行了一定的划分。

    这种划分以一种类似于结构化程序设计中的耦合性定义呈现在软件度量研究者面前,使得研究者可以根据不同的耦合机制提出不同的耦合性度量方法,极大地方便了系统耦合性的度量。但是Eder等人的划分对于耦合性解耦方面的研究来说,存在着一定的缺点:没有充分考虑面向对象系统的特点,导致有的耦合定义在面向对象的语言中并无相应的实现与之对应。如对公共耦合的定义中给出的是方法间通过无结构的、全局共享数据空间来进行通信。但实际上在面向对象的语言中是找不到这样的例子的。

    因此,本文基于耦合性解耦研究考虑,按照Myers所建议的耦合性分类种类,在Eder等人的三维耦合性框架的基础上,结合面向对象的特点,将面向对象系统的耦合性(按照耦合强度)划分成6类:内容耦合、公共耦合、控制耦合、标记耦合、继承耦合和接口耦合。下面分别针对不同的耦合,给出详细的定义与分析,并对其解耦策略进行详细的讨论。
    3 耦合性解耦策略分析 
    3.1 内容耦合

    定义:类中的一个方法直接访问另一个类的私有数据成员,则称之为内容耦合。

    分析:私有数据成员意味着一个类接口的非公开部分,例如在C++中一个方法被声明为一个类的友元[5],则此方法就可以调用这个类中的任何一个私有方法。该耦合方式严重打破了面向对象的封装性,它将一个类的方法与数据内部实现暴露给了其他类的方法,从而当类的具体实现发生改变时,其他类也要随之发生改变,其本质是私有实现的外露。

    解决方案:内容耦合的目的是在两个类之间实现一次私有通讯。为了能在实现类之间的私有通讯的同时,又不破坏类的封装性,这里可以采取两种方法实现:一种方法是在两个需要进行私有通讯的类之间加一层抽象接口;
    另一种方法是对提供服务的类增加Property。

    实例:设需要访问私有数据的类为DataClient,而提供私有数据的类为DataServer,为了能在实现类之间的私有通讯的同时,又不破坏类DataServer的封装性,那么可以在这两个类之间定义一个抽象的数据提供接口DataProvider,该抽象接口定义统一数据访问函数,这些数据访问函数在DataServer中具体实现。这样当DataClient需要访问DataServer的私有数据时,就可以通过调用接口DataProvider的数据访问函数来获得。这种通过抽象接口的数据访问方法使得DataClient访问DataServer的私有数据成员实际上是对接口的访问,而不是直接对DataServer的私有数据进行访问,这样就避免了两个类之间的内容耦合,保证了通讯的私有
    性和类的封装性,而且当DataServer的具体实现发生变化,只要DataProvider的数据访问接口不变,则DataClient也就不用改变,这样就克服了私有实现变化外露带来的负面影响。这种解决方案的类结构图如图1所示。

    另一种方法是对DataServer增加一个Property,这个Property只读DataServer的私有数据成员,这样DataClient在需要访问DataServer的私有数据成员,可以通过使用DataServer的属性,访问到相应的数据内容。当DataServer改变时,只要Property不变,则DataClient也就不用改变,这种方法同样也能克服私有实现变化外露带来的负面影响。但需要说明的是这种方法具有一定的局限性:不是所有的面向对象语言都支持Property,如 C++等是不支持这种方法的。

     
    3.2 公共耦合

    定义:类与类的方法之间通过全局的,共享的数据空间来交换信息,这样两个类之间就存在了公共耦合。

    分析:在面向对象的程序设计中,有时全局数据结构的使用是不可避免的。由于这样的公共数据结构可能是在类内部定义的,而如果其他类使用了此公共数据结构,即类间存在了公共耦合,一旦此公共数据结构有所改变,则其他使用此公共数据结构的类都要随之改变,显然,这不是我们所希望的。其实不但是类的设计存在这种问题,在软件框架的设计中也存在相应的问题,因为软件框架在演化的过程中也会改变公共数据结构,这样相应的外部应用也要发生改变,这就破坏了软件框架演化过程中的向后兼容性。

    解决方案:在面向对象的程序设计中,应该尽量避免采用全局数据结构,如果无法避免,则应尽可能地将此数据结构的定义与实现分开,将其实现部分隐藏在相应的接口后面,然后通过一个全局的入口来访问该接口,最后通过该接口访问相应的数据结构。
    3.3 控制耦合

    定义:一个类的状态影响另一个类行为的执行,称为控制耦合。

    分析:在面向对象的程序设计中,有的设计要根据一定的条件来决定执行哪个具体类的同一个方法,即利用If语句或者Case语句来决定控制的流向。例如:一个显示图形的类(ShowCls),要根据用户不同的需求显示不同的图形,如圆形、方形等等。如果采用If语句或者Case语句来控制程序流向的话,就会存在如下问题:当条件分支增加后,代码需要被重新改写加以扩充,以对应增加的情况,这样就必须通过改写条件语句的源代码来实现逻辑控制与条件的紧密耦合,显然这样不利于程序的修改、扩充和重用。

    解决方案:控制耦合主要是控制条件和控制逻辑间的耦合。要解决控制耦合,可以将控制条件作为类的内部状态,由类对象根据自身的状态决定执行什么样的操作。当执行的动作相同,只是在不同的情况下其动作内容不同时,可以采用多态技术来避免条件语句所造成的问题,其技术基础在于继承机制和虚函数。

    实例:例如上述显示图形的例子,可以定义一个抽象基类ShowCls和两个派生于ShowCls的具体类Round和Square,抽象基类ShowCls包括一个多态接口元素-虚函数Show(),客户程序可以通过指向基类ShowCls的指针(或引用)来调用这个虚函数,从而按照不同的客户需求来操纵不同具体对象之相应成员。这种根据不同的状态调用不同的成员函数的方法,从一个侧面也体现了面向对象编程风格的优雅。类结构图如图2所示:


    3.4 标记耦合

    定义:如果把整个数据结构作为一个参数来传递,就会产生标记耦合。

    分析:如果两个类之间通过将整个数据结构作为参数传递而存在标记耦合,则一旦方法所依赖的数据结构发生变化,如对此数据结构进行了扩充,则该方法也要随之变化。其本质是类的方法依赖于某个外部定义的数据结构。

    解决方案:解决标记耦合可以采用模板技术[5],通过定义模板函数和模板类。
    3.4.1 定义模板函数具体方法如下:定义一个模板函数,将类型参数化,使不同的函数和类共享同一段代码,不管什么样的数据结构,都可以调用同样的模板函数,这样只需实现一次类代码就可以满足不同数据结构的需求,从而不但可以消解标记耦合,同时还可以提高开发效率。
    3.4.2 定义一个模板类和定义一个模板函数的思想类似,都是类型参数化,在思想方面不再详细讨论。在实现方面,模板类的实现代码与普通类的实现代码没有太大的不同,但也有一定的要求。以++为例,模板类需要在每个成员函数的实现代码前面加上template关键字及<>内的参数原型,并且类名后面加上<>及其内部的参数,但不必声明参数,因为在template<>中已经声明[3]。运用模板类的方法一样可以消解标记耦合,提高开发效率。
    3.5 继承耦合

    定义:由于类之间的继承关系产生的耦合称为继承耦合。

    分析:继承耦合主要指的是实现继承,它打破了类的封装性,使得父类与子类被绑定在一起,当父类的实现发生变化时,无论它的子类的实现是否需要这种变化,都要强制性地随之发生变化,从而导致无法对父类和子类进行独立的修改、扩充和重用。

    解决方案:要消解实现耦合引起的继承耦合,就要区分哪些是将来可预见的要发生变化的部分,哪些是不会发生变化的部分。对于可能发生变化的部分,将其实现为保护型虚函数,并由实现继承代码调用,即采用Templete Method模式[2]来实现。

    实例:例如上述3.3中显示图形的例子,抽象基类ShowCls和派生于ShowCls的具体类Round和Square,可先预见出父类的哪些部分是会发生变化的,哪些稳定性较好。然后定义一个公有的方法PublicMethod,其实现的内容为程序中不发生变化的部分,同时定义一个保护型虚函数,其实现的内容为程序中发生变化的部分,然后在PublicMethod方法中调用保护型的ProtectedMethod方法,当应用程序的实现发生变化时,而只需重载ProtectedMethod方法即可,这就为程序的扩充和修改提供了很大的灵活性。其类结构图如图3所示:


    3.6 接口耦合

    定义:类与类之间的交互是通过接口进行交互的,这样无论哪个类的实现部分发生了变化,只要其接口部分不变,则其他与之进行交互的类都不用改变。这种方式的耦合所造成的耦合度最低,可以说是面向对象程序设计中耦合性的理想。
    4 总结

    实际上无耦合的软件系统是不存在的,因为如果对象之间都是相互孤立的,则系统只能完成非常简单的功能,这样的系统是无法满足用户需求的。本文通过对不同耦合性的分析,利用降低耦合性的一些原则,并结合设计模式的思想,提出了改善软件系统耦合性的解耦策略,目的是为降低软件的耦合性提供了一定设计上的帮助,而不是完全消除耦合。同时我们认为,面向对象系统耦合性的研究还需要同面向对象软件度量技术的研究相结合。在源程序的基础上,通过面向对象耦合性度量工具[6],根据不同的度量指标判断是什么类型的耦合,然后应用解耦策略,重新设计后,再次度量,从而更加有效地保证软件设计的质量,这是进一步的研究方向。
    [参考文献]
    [1] Briand .L, Daly .J, and Wüst .J.  A Unified Framework for Coupling
    Measurement in Object-Oriented Systems, IEEE Trans. Software Eng, 1999,25(1):91~121.
    [2] Gamma E, Helm R, Ralph J, Vlissides J.著, 李英军 等译. 设计模式可复用面向对象软件的基础[M]. 北京:机械工业出版社, 2000, 9.
    [3] Eckel B, 刘宗田,邢大红,孙慧杰 等译. C++编程思想[M]. 北京:机械工业出版社, 2000,1.
    [4] Robert C Martin. Design principles and design patterns[EB/OL]. www.objectmentor.com, 2000,(10).
    [5] Stanley B L, 侯捷 译. Essential C++[M].武汉:华中科技大学出版社,2001.8.
    [6] 牛家浩等,基于抽象语法树的软件度量工具的设计与实现[M].计算机应用23(10):39~41.

    相关热词搜索:

    • 范文大全
    • 说说大全
    • 学习资料
    • 语录
    • 生肖
    • 解梦
    • 十二星座

    推荐访问