软件的重用性的高低就取决于它的耦合程度的高低

一个软件,它具有许多类,类与类之间需要互相调用,一旦某个类与另一个类具有紧密耦合关系的时候,这个软件的重用性就会大大降低。所以一个软件的重用性的高低就取决于它的耦合程度的高低。

耦合度:程序模块之间的关联、依赖程度。

在设计过程中提出:当设计这个软件的体系结构的时候,就发现了这个软件的逻辑运行部分(SimpleRouter类)和输出部分(SimpleRouterFrame类)不能很好的结合起来。即:我们不得不将程序界面的引用(reference to SimpleRouterFrame)一层一层的传递给程序的核心部分,以提供输出功能。

在开发过程中提出:当我们对输出界面(SimpleRouterFrame类)进行了一些修改后,特别是某些方法名称修改后,相应程序核心部分(SimpleRouter类)的代码也需要重新修改以适应这个新的输出界面。

问题的原因:类与类之间耦合的过于紧密,以至于每次需要修改一个类,它相应的关联类都需要修改代码来适应这个修改过的类。 比如说:某个类A需要直接显示的调用另一个类B的public方法,一旦B不再支持这个方法,或者重写了这个方法名称,A就需要重新编写代码来适应。另一种情况:某类A需要用到具有某种特定方法的类B,但B的形式并不确定,一旦B的内部结构改变,A就可能需要重写代码。

为避免这种情况,需要降低A与B之间的耦合度,不论形式如大发888娱乐城何,只要B仍然能够实现A所需要的功能,A就不需要重写代码, 解决方法:令B实现某种接口I,定义 I.Method(); 同时A在调用B的方法时候直接调用I的方法即可;而从前会将B当作参数传给A,然后A再调用B的方法的地方

{
    A.AMethod( B b ) {
    	b.BMethod();
    	/*….*/
  	}
}

修改成:

{
    A.AMethod( I i ) {
    	i.Method();
	}
}

在这里,B只需要实现I.Method()方法即可,完全隐藏了实现细节。 按照这种方法,既实现了类与类之间的松散耦合,大大增强了类的可重用性。回顾从前学过的设计模式,可以发现,这与Observer模式有相似之处。

下面是一个完整的例子:

<?php
interface Calculation {
	function compute($a, $b);
}
class Addition implements Calculation {
	function compute($a, $b)
	{
		return "加法运算结果为:".($a+$b);
	}
}
class Subtraction implements Calculation {
    function compute($a, $b)
	{
    	return "减法运算结果为:".($a-$b);
    }
}
class Multiplication implements Calculation {
    function compute($a, $b)
	{
    	return "乘法运算结果为:".($a*$b);
    }
}
class Division implements Calculation{
    function compute($a, $b)
	{
    	return "除法运算结果为:".($a/$b);
    }
}
class Modf implements Calculation {
    function compute($a, $b)
	{
    	return "取模运算结果为:".($a % $b);
    }
}
class Coupling implements Calculation {
	//这里直接:public $varl = new LazyDog(); 会出错。
	public $varl = null;

	function __construct()
	{
     	$this->varl = new LazyDog();
  	}

	function compute($a, $b)
	{
		return $this->varl->say();
	}
}
/*也可以用继承的方式实现哟:
class Coupling extends LazyDog implements Calculation {
	function compute($a, $b)
	{
		return parent::say();
	}
}
*/
class LazyDog {
	function say()
	{
    	return "我什么运算都不做...只是为了实现‘耦合设计模式‘...我是出来打酱油的......";
	}
}
class Test {
	private $one;
	private $two;
	public function __construct($x,$y)
	{
		$this->one=$x;
		$this->two=$y;
   		echo "Class Test 初始化:属性\$one=".$this->one.",属性\$two=".$this->two."<hr />";
   }
   function display(Calculation $a){
		return "用PHP接口技术实现的运算:".$a->compute($this->one,$this->two)."<hr />";
   }
}
$t = new Test(96,12);
$t1 = new Addition();
$t2 = new Subtraction();
$t3 = new Multiplication();
$t4 = new Division();
$t5 = new Modf();
$dog = new Coupling();
echo $t->display($t1);
echo $t->display($t2);
echo $t->display($t3);
echo $t->display($t4);
echo $t->display($t5);
echo $t->display($dog);
?>

程序运行结果:

Class Test 初始化:属性$one=96,属性$two=12
用PHP接口技术实现的运算:加法运算结果为:108
用PHP接口技术实现的运算:减法运算结果为:84
用PHP接口技术实现的运算:乘法运算结果为:1152
用PHP接口技术实现的运算:除法运算结果为:8
用PHP接口技术实现的运算:取模运算结果为:0
用PHP接口技术实现的运算:我什么运算都不做...只是为了实现‘耦合设计模式‘...我是出来打酱油的......
时间: 2024-10-11 18:20:09

软件的重用性的高低就取决于它的耦合程度的高低的相关文章

Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概念,快速理解他们的区别与联系? 如果大家觉得还有必要把这块更新的更好,还请多多反馈. 如果觉的对您有用还请点击 “推荐”下,我会持续更新更多新的内容. 古老的传说 相传盘古开天劈地后,女娲一天在黄河边梳头时,突发奇想以泥土仿照自己抟土造人,创造并构建人类社会.后来又替人类立下了婚姻制度,经过一代又一

组件的重用性

什么是组件的重用性? 我们把一个大的功能拆分为一个一个的小模块,比如按钮.表单.下拉框.轮播图等. 提高组件的重用性有什么好处呢? 1. 写更少的代码. 2. 减少开发时间. 3. 代码的bug更少. 4. 占用的字节更少. 为了保证数据的正确性,我们可以对props的数据进行验证,验证方法如下: React.createClass({ propTypes:{ optionArray : React.PropTypes.array } }) React 允许你为组件设置默认的props: var

Hibernate的CRUD重用性

1.在研究了hibernate框架之后,准备完成一套Hibernate的CRUD操作,并且让其具有高度的重用性.在复杂查询方面,hibernate可谓是各种不方便,因此查询方面,利用java反射做出一套根据对象属性来动态查询数据的小框架. 2.先做出可行的设计图 3.具体的实现过程 1 package com.framework.common.dao; 2 3 import test.framework.common.PageEntity; 4 5 import java.util.List;

关于 CSS 的重用性

使用 CSS 大概也有三四个月了,仔细回想了一下这三四个月所写下的CSS,发现都是挺杂乱的.几乎页面的任何一个元素,都有它自己的style,满篇的 float:left; display:block; color:#666: 没有 一种看到就很清爽的样子,而且 给 CSS 文件的大小带来很大的影响. 回想了下,其实大不必这样,可以采用 诸如以下的代码,来提高重用性,也能让页面的可读性变得更强! fl{float:left;} fr{float:right;} w1200{width:1200px

CSS垂直翻转/水平翻转提高web页面资源重用性——张鑫旭

一.CSS下兼容性的元素水平/垂直翻转实现 随着现代浏览器对CSS3的支持愈发完善,对于实现各个浏览器兼容的元素的水平翻转或是垂直翻转效果也就成为了可能.相关的CSS代码如下: /*水平翻转*/ .flipx { -moz-transform:scaleX(-1); -webkit-transform:scaleX(-1); -o-transform:scaleX(-1); transform:scaleX(-1); /*IE*/ filter:FlipH; } /*垂直翻转*/ .flipy

CSS垂直翻转/水平翻转提高web页面资源重用性

原文:www.zhangxiyu 一.CSS下兼容性的元素水平/垂直翻转实现 随着现代浏览器对CSS3的支持愈发完善,对于实现各个浏览器兼容的元素的水平翻转或是垂直翻转效果也就成为了可能.相关的CSS代码如下: /*水平翻转*/ .flipx { -moz-transform:scaleX(-1); -webkit-transform:scaleX(-1); -o-transform:scaleX(-1); transform:scaleX(-1); /*IE*/ filter:FlipH; }

python\组合与重用性

1 组合 组合的概念:软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 >>> class Equip: #武器装备类 ...     def fire(self): ...         print('release Fire skill') ... >>> class Riven: #英雄Riven的类,一个英雄需要有装备,因而需要组合Equip类 ...     camp='Noxus'

12-27cell 的可重用性(英雄列表应用性能的优化)

在英雄列表中动态生成cell的代码在中, - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //    创建一个cell并且设置cell的风格 UITableViewCell *cell  = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseId

开源软件许可证 严格性比较

开源软件许可证 严格性比较 宽松:MIT > BSD > Apache > LGPL > GPL > AGPL1.MIT:MIT许可证之名源自麻省理工学院(Massachusetts Institute of Technology, MIT) 只有一点限制:所有应用必须包含版权声明和许可声明(自己修改后的声明) 2.BSD 可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 强调重代码作者的著作权 只有两点限制:1.只需要把原来的BSD协议(不可以改