耦合度越低越好吗?

先说说3层架构,一般数据层,业务层,表示成。
一般针对某一机能,一般分3个类,XXView,XXBusiness,XXDao。
通常的情况下,XXBusiness和XXDao是组合关系,即XXBusiness有一个XXDao的对象。
一般情形如下
XXBusiness{
private XXDao mXXDao ;
public XXBusiness(){
XXDao = new XXDao ();
}
public List select(){
return mXXDao .select();
}
}
今天突然有人问我。XXBusiness内部不保存mXXDao ,每次都用的时候就new行不?
这个问题,说实话,我还真没考虑过,还真没有这么用过。
他的想法形同如下代码:
XXBusiness{
public List select(){
XXDao mXXDao = new XXDao ();
return mXXDao .select();
}
}
这么看看好像是降低了XXBusiness和XXDao的耦合度!但耦合度真的越低越好吗?
这个耦合度适合这个业务需求吗?
这里明显是把组合的关系变成了依赖的关系。耦合度视乎降低了。
但是真实业务的耦合度,实际没有变化。
我这里先下一个结论。耦合度并不是越低越好,而是适合需求。
通常情况下XXDao就是为XXBusiness提供数据服务的。
这里是事实上的紧密关系,强行的降低关系实际上是破坏了他俩的正常关系。
就比如社会中的关系,父亲和儿子的关系就应该是亲密,就应该住在一起的。
这时候你就让他俩分开住,这是不合适的。
在社会而样,有父子这样的亲密关系,反而使社会变得简单,如果强行的降低父子关系,反而会使社会的复杂度增加。
这里也是同样的到来,耦合度是适当,而不是降得越来越低。
对于设计,耦合应该是尽量减少,联系,和依赖的关系,而不是消除组合和聚合的关系,组合和聚合,通常会形成新的内聚团体,都整体架构不会增加复杂度。

关于上面的问题,我首先从耦合度的角度发表了我自己的看法。
下面在从性能的角度做一下分析。
这是首要的问题,就是成员对象的价值。
如果在一个对象的生命周期中,只用一次当然几乎没有必要定义一个成员。
但是如果用多次呢,多多少次呢,从性能的角度我们就要考虑是否用一个成员对象了。
从性能的角度讲,超过两次,我们就可以设置一个成员对象了。
这里的两次通常有可以有两种选择,时间维度和空间维度。
时间维度指,一个函数会再对象的生命周期内被多次调用,这个函数依赖的对象会多次创建和销毁。
空间维度,在一个对象内的函数中会多处依赖另一个对象。
空间维度通常是要考虑一个代码容易的问题,因为两处使用了相同且冗余的代码,通常是要把这两个函数用到的共同的其他对象变成成员对象的。

当然基于性能的考虑往往需要有一个设计中对性能要求的基调,
因为设计的过程中会面临很多设计和性能的选择。
关于这个问题,就说这些了。
在有想法在补。

其实这里的两次或两处调用其他对象的方式,其实是由很多选择的
1.静态单实例其他对象
class A{
static A mA = new A();
static A getA(){
return mA;
}
public fun();
}
class B{
public fun(){
A. getA().fun();
}
}
2.静态其他函数
class A{
static public fun();
}
class B{
public fun(){
A.fun();
}
}
3.本对象内其他对象单实例
class A{
static A mA = new A();
static A getA(){
return mA;
}
public fun();
}
class B{
A mA=null ;
A getA(){
if(null == mA){
mA = new A();
}
return mA;
}
public fun(){
getA().fun();
}
}
这3种方案其实都是等同于B持有A成员变量的设计。但是针对性能做了些选择。
1.静态单实例其他对象
这种方案,是保证对象只创建一次,是空间换时间的性能设计,因为有一个对象常驻空间。
2.静态其他函数
这也是空间换时间,一个对象本身就放在了静态区。
3.本对象内其他对象单实例
哦,这也是空间换时间,3个种方式都是空间换时间的做法。
差别在于,空间的生命周期略有不同
2.静态其他函数>1.静态单实例其他对象>3.本对象内其他对象单实例
在从空间生命周期尽量小的角度考虑,3的解决方案是相对更合理。
针对最初的问题:XXBusiness内是否要保存XXDao 的成员对象?用方案3与其做一下对比吧。
为了对比给这个方案起个名:降耦合方案
XXBusiness{
public List select(){
XXDao mXXDao = new XXDao ();
return mXXDao .select();
}
}
假设XXBusiness超过一次使用XXDao。

降耦合方案 :因为多次创建对象,消除对象,时间复杂度增加。
本对象内其他对象单实例:时间复杂度,降低,但XXDao常驻内存的时间较长。
个人观点:选择方案3,与普通成员对象比,XXDao的创建时间延长了,但是不在重复创建对象,节省了时间效率。如果空间不紧张的情况下,无疑用这个方案是没有任何坏处的,唯一的坏处,XXDao占用内存是时间有点常,但是也会随着XXBusiness的结束而结束,并不会常驻内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值