我有一大堆对象,我需要能够对每个对象做一些复杂的事情,所以我有一些相当长的功能。
一般情况下,将long函数放在实际用于(GreatObject
,下面)的类中以进行正确的封装是否更好,或者将一个函数放入其中是否更有效率?集合类(GreatSet
,它只有一个实例)?
class GreatSet(object):
def __init__(self):
self.great_set = [] # Will contain a lot of GreatObjects.
def long_method(self, great_object): # Is this function better here?
[Many lines of code]
class GreatObject(object):
def __init__(self, params):
self.params = params
def.long_method(self): # Or here?
[Many lines of code]
我正在使用Python 2.7。
答案 0 :(得分:3)
在这两种情况下,long_method
都属于它的类(每个类都有一个long_method
函数,由所有实例共享),在这两种情况下查找obj.long_method
将为每个查找创建一个新的Method
实例,所以wrt /“效率”(无论它应该是什么意思)它都没有任何区别。此外,除非您需要最大的时间和空间表现 - 在这种情况下,较低级别的语言可能是最佳选择 - 您应该真正感受到更多关注正确的设计和可维护性,而不是最大的原始性能。
因此,如果long_method
应该在GreatObject
上工作,可能属于GreatObject
,但是则取决于这些类的相应责任,long_method
实际执行的操作以及long_method
,GreatObject
和GreatSet
所属的应用程序层。例如,如果GreatObject
和GreatSet
都属于域模型而long_method
属于与演示相关的内容,那么显然long_method
既不属于GreatObject
也不属于{{1} }}
最后,正如PartialOrder在他的评论中提到的,“长”功能通常是代码/设计气味。有时函数必须“足够长”,因为它做了一些复杂的事情 - 即使这样你通常也可以将它重构为更小的函数(如果那些函数需要共享状态,最终会重构为不同类的方法) - 但通常是长函数意味着它只是在做太多事情。