如何避免类的膨胀

简介: 类的膨胀(Bloating)指的是类中成员过多,甚至出现无序增加的情况。过大的类,会使得复杂度急剧增加,维护会变得更为困难。

类的膨胀(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

目录
相关文章
|
7月前
|
Arthas 运维 监控
定位频繁创建对象导致内存溢出风险的思路
定位频繁创建对象导致内存溢出风险的思路
173 1
|
3月前
|
算法
出现线程死锁缺陷一般有那些原因?该怎么解决?
出现线程死锁缺陷一般有那些原因?该怎么解决?
29 1
|
9月前
1246:膨胀的木棍 2020-12-28
1246:膨胀的木棍 2020-12-28
|
8月前
|
设计模式 Java
8.2 内部类的性能考虑:如何避免内存泄漏
8.2 内部类的性能考虑:如何避免内存泄漏
70 0
|
9月前
|
安全 算法 关系型数据库
如何避免在C#中出现混乱代码
如何避免在C#中出现混乱代码
|
9月前
|
缓存 Linux 容器
深入了解锁细节
深入了解锁细节
43 0
J3
|
存储 安全 Java
synchronized解析及锁膨胀过程,面试再也不怕了
synchronized解析及锁膨胀过程,面试再也不怕了
J3
494 0
synchronized解析及锁膨胀过程,面试再也不怕了
|
算法 Java Linux
如果面试官让你分析类初始化阶段的死锁现象
哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。
78 0
如果面试官让你分析类初始化阶段的死锁现象
|
程序员
搞懂这 10 张脑图后,我膨胀了。(一)
秋招也快接近尾声了,我在秋招的结尾意外地收获了网易互娱的 Offer,秋招就此结束,写下这篇文章是为了帮助更多师弟师妹们,希望能帮助到你们。
搞懂这 10 张脑图后,我膨胀了。(一)
|
SQL 存储 算法
搞懂这 11 张脑图后,我膨胀了。(二)
秋招也快接近尾声了,我在秋招的结尾意外地收获了网易互娱的 Offer,秋招就此结束,写下这篇文章是为了帮助更多师弟师妹们,希望能帮助到你们。
搞懂这 11 张脑图后,我膨胀了。(二)