我有一个类BigStructure从一些输入构建一个复杂的数据结构.它还包括对该数据结构执行操作的方法.
这个课程变得太大了,所以我试图把它分成两部分来帮助维护.我认为将课程转移到一个新班级是很自然的,比如上课OperationsOnBigStructure.
不幸的是,由于课程BigStructure非常独特,OperationsOnBigStructure因此无法与其他课程合理地重复使用.从某种意义上说,它永远与之相关BigStructure.例如,典型的操作可能包括以对BigStructure对象有意义的方式遍历大型结构实例.
现在,我有两个课程,但感觉我没有改进任何东西.事实上,我使事情稍微复杂一点,因为我现在需要将BigStructure对象传递给方法OperationsOnBigStructure,并且他们需要在内部存储该对象.
我应该和一个大班同学吗?
我认为将操作转移到一个新类(例如 OperationsOnBigStructure 类)中是很自然的。
我想说,这与面向对象设计的全部内容完全相反。OOD 背后的理念是将数据和方法放在一起。
通常,(太大)班级是责任过多的标志:即您的班级只是做了太多事情。看来您首先定义了一个数据结构,然后向其中添加了函数。您可以尝试将数据结构分解为子结构并为它们定义独立的类(即使用聚合)。但如果不了解更多,就很难说...
当然,有时,一个程序在一个大类中运行得很好。但如果你自己对此感到不舒服,那就强烈暗示你要开始做一些反对的事情......
我想出的解决这个问题的方法是创建一个包含类的包.有点像:
MyClass/
__init__.py
method_a.py
method_b.py
...
Run Code Online (Sandbox Code Playgroud)
在我的情况下__init__.py包含实际的数据结构定义,但没有方法.要将方法"附加"到类中,我只需将它们导入类的命名空间即可.
内容method_a.py:
def method_a(self, msg):
print 'a: %s' % str(msg)
Run Code Online (Sandbox Code Playgroud)
内容__init__.py:
class MyClass():
from method_a import method_a
from method_b import method_b
def method_c(self):
print 'c'
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
这对我有用.
| 归档时间: |
|
| 查看次数: |
2363 次 |
| 最近记录: |