如何避免类的膨胀

类的膨胀(Bloating)指的是类中成员过多,甚至出现无序增加的情况。过大的类,会使得复杂度急剧增加,维护会变得更为困难。所以需要控制类的增长。本文总结了一下,简单介绍四种解决的方式,我故意用四个来讲,主要为了介绍最后一种方式。
(以下将需要避免膨胀类称为目标类,即类图中的Car类。)

友元类

这个是最为原始的思路。成员变量仍然要增加,以友元类可以访问类的私有成员的能力来减少一些方法。
这种方式的坏处是将所有的调用者加入友元类并不现实。它的情形类似:
friend_class
class Car {
……
friend class Driver;
friend class Sales;
friend class Passenger;
……
}

Helper Class

如果将新增加的成员放到一个Helper Class中,这样目标类提供新的方法供外部使用,内部再调用Helper的实现。这种方式下方法仍然要增加。
helper_1
而另一种方法,也是比较常用的。在目标类中提供一个函数将Helper class开放出去,可以供需要使用它的类直接使用。
helper_2
【这里Helper class也可以是目标类的友元类。】

Visitor模式

有时我们只是要利用一个类现有的方法来实现不同的算法。就可以使用观察者模式来实现。
将需要新增加的算法放到Vistor中,而不是目标类中。如果有需要也可以将Visitor设为目标的友元类。
visitor
这个方案与Helper Class的最大差异在于客户端可能需要不同版本的算法实现,而且是由客户端指定。

绑定形式的Helper Class

无论是简单的Helper Class,还是Visitor模式,Helper及Visitor的生命周期管理都需要由目标类及客户类管理。另外Helper Class不能将不同类别的方法和成员变量区分出来 (不同类别代表了不同职责,我们可不要God Class),而Visitor不适用于需要增加成员变量的需求。
在Chromium中提供了一个类似Binding的机制。原理上就是将我要增加的数据和方法按不同的类别封装成一个个类,然后以自身指定的内容作为key绑定到目标类上。需要使用时使用一个静态方法,传入之前指定的key就可以取到对应类,然后操作。

本质上这也是一个Helper Class的实现,只是这个Helper完成了相关数据对象的存取操作。
结构如下:
user_data_binding
(详见Chromium代码中的base::SupportsUserData。)

这时目标类不用改动一行代码,就能增加它所持有的数据和方法了。

转载请注明出处:http://blog.csdn.net/horkychen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值