拆分过大的类
我有一个叫做 BigStructure
的类,它用一些输入数据构建了一个复杂的数据结构。这个类里还有一些方法,可以对这个数据结构进行操作。
但是,这个类变得太大了,所以我想把它拆分成两个类,这样更容易维护。我觉得把操作部分放到一个新类里,比如叫 OperationsOnBigStructure
,是个不错的主意。
可惜的是,因为 BigStructure
这个类非常独特,OperationsOnBigStructure
不能和其他类一起合理地使用。从某种意义上说,它永远和 BigStructure
绑在一起。举个例子,某个典型的操作可能需要以一种只对 BigStructure
对象有意义的方式遍历这个大结构的实例。
现在,我有了两个类,但感觉并没有改善什么。实际上,我让事情变得稍微复杂了一点,因为我现在需要把 BigStructure
对象传递给 OperationsOnBigStructure
中的方法,而且这些方法还需要在内部保存这个对象。
我是不是应该就这样继续用一个大类呢?
5 个回答
"""现在,我有了两个类,但感觉好像没有任何改善。实际上,我让事情变得稍微复杂了一点,因为我现在需要把BigStructure对象传递给OperationsOnBigStructure中的方法,而且它们需要在内部存储这个对象。"""
我觉得一个自然的做法是让“OperationsOnBigStructure”继承自BigStructure,这样所有相关的代码就都在一个地方了,不需要额外传递参数,因为它需要操作的数据会包含在“self”里面。
我为这个问题想出的解决办法是创建一个包来包含这个类。大概是这样的:
MyClass/
__init__.py
method_a.py
method_b.py
...
在我的例子中,__init__.py
文件里包含了实际的数据结构定义,但没有方法。为了把方法“附加”到这个类上,我只是把它们导入到类的命名空间里。
method_a.py
文件的内容是:
def method_a(self, msg):
print 'a: %s' % str(msg)
__init__.py
文件的内容是:
class MyClass():
from method_a import method_a
from method_b import method_b
def method_c(self):
print 'c'
在 Python 控制台里:
>>> from MyClass import MyClass
>>> a = MyClass()
>>> dir(a)
['__doc__', '__module__', 'method_a', 'method_b', 'method_c']
>>> a.method_a('hello world')
a: hello world
>>> a.method_c()
c
这个方法对我来说是有效的。
我在想,把操作放到一个新的类里,比如叫做 OperationsOnBigStructure,这样做很自然。
我觉得,这其实和面向对象设计的理念正好相反。面向对象设计的核心思想是把数据和方法放在一起。
通常,一个(过于)大的类意味着它承担了太多的责任,也就是说,这个类做的事情太多了。看起来你是先定义了一个数据结构,然后再给它添加了功能。你可以尝试把这个数据结构拆分成几个小结构,然后为这些小结构定义独立的类(也就是使用聚合)。不过在不了解更多情况的前提下,很难给出具体建议……
当然,有时候一个程序用一个大类也能正常运行。但如果你自己觉得不舒服,那就是一个很强烈的信号,提示你该开始做点什么了……