首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拆分过大的类

拆分过大的类
EN

Stack Overflow用户
提问于 2012-02-06 12:36:57
回答 5查看 4.1K关注 0票数 7

我有一个BigStructure类,它从一些输入构建复杂的数据结构。它还包括在该数据结构上执行操作的方法。

这个类变得太大了,所以我试着把它一分为二,以提高可维护性。我在想,将操作移动到一个新的类中是很自然的,比如OperationsOnBigStructure类。

不幸的是,由于类BigStructure是独一无二的,OperationsOnBigStructure不能合理地重用于任何其他类。从某种意义上说,它永远与BigStructure捆绑在一起。例如,典型的操作可能包括以仅对BigStructure对象有意义的方式遍历大型结构实例。

现在,我有两个类,但我感觉我没有提高任何东西。实际上,我把事情变得稍微复杂一些,因为我现在需要将BigStructure对象传递给OperationsOnBigStructure中的方法,而它们需要在内部存储该对象。

我是不是应该和一个大班一起生活?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-06 16:14:51

我在想,将操作转移到一个新的类中是很自然的,比如OperationsOnBigStructure类。

我要说的是,这与面向对象的设计完全相反。OOD背后的思想是将数据和方法保持在一起。

通常,一个(太)大的类是责任太大的标志:即你的类只是做了太多的事情。看起来您首先定义了一个数据结构,然后向其中添加了函数。您可以尝试将数据结构分解为子结构,并为这些子结构定义独立的类(即使用聚合)。但如果不知道更多就很难说...

当然,有时候,一个程序只需要一个大的类就可以很好地运行。但是如果你自己对它感到不舒服,这是一个强烈的提示,开始做一些事情来反对……

票数 3
EN

Stack Overflow用户

发布于 2014-07-21 23:00:09

对于这个问题,我想出的解决方案是创建一个包含类的包。大致是这样的:

代码语言:javascript
运行
复制
MyClass/
    __init__.py
    method_a.py
    method_b.py
    ...

在我的例子中,__init__.py包含实际的数据结构定义,但不包含方法。要将方法‘附加’到类中,我只需将它们导入到类的命名空间中。

method_a.py的内容:

代码语言:javascript
运行
复制
def method_a(self, msg):
    print 'a: %s' % str(msg)

__init__.py的内容

代码语言:javascript
运行
复制
class MyClass():
    from method_a import method_a
    from method_b import method_b

    def method_c(self):
        print 'c'

在python控制台中:

代码语言:javascript
运行
复制
>>> 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

这对我很有效。

票数 8
EN

Stack Overflow用户

发布于 2012-02-06 16:06:20

例如,典型的操作可能包括以只对BigStructure对象有意义的方式遍历大型结构实例。

也许您可以编写一些生成器作为BigStructure的方法,以完成繁琐的遍历工作。然后,OperationsOnBigStructure可以在执行任务时循环遍历迭代器,这可能会提高代码的可读性。

因此,通过使用两个类而不是一个类,您可以在两个阶段提升抽象级别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9155618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档