重构:突破类或只是新文件的功能?

时间:2014-06-01 19:53:39

标签: python refactoring

在python中进行重构时,什么是最佳实践和/或更多pythonic,

  1. 打破一个类(就像你在Java中那样)或
  2. 只是打破了这个功能(你在Java中无法做到的)?
  3. 示例:

    假设我有以下文件

    **large_file.py**
    
    def large_function(x):
        # ...lots of code...
        return foo(y)
    
    def foo(y):
        # ...lots of code...
        return function_only_called_by_foo(z)        
    
    def function_only_called_by_foo(z):
        # ...lots of code...
        return output 
    

    重构这种方法的一种自然方法是将foo()function_only_called_by_foo()分解为各自独立的文件。但是在Java中我没有太多选择如何做到这一点,我可以想到在python中这样做的两种方法。

    备选方案1:

    **large_file.py**
    
    from fooer import Fooer
    def large_function(x):
        # ...lots of code...
        fooer = Fooer()
        return fooer.foo(y)
    
    
    **fooer.py**
    
    class Fooer:
    
        def foo(y):
            # ...lots of code...
            return _function_only_called_by_foo(z)        
    
        def _function_only_called_by_foo(z):
            # ...lots of code...
            return output 
    

    备选方案2:

    **large_file.py**
    
    from foo_file import foo
    def large_function(x):
        # ...lots of code...
        return foo(y)
    
    
    **foo_file.py**
    
    def foo(y):
        # ...lots of code...
        return _function_only_called_by_foo(z)        
    
    def _function_only_called_by_foo(z):
        # ...lots of code...
        return output 
    

    哪种替代方案更优越,为什么? (或者还有更好的选择吗?)

    这些方法都不共享任何实例变量。

1 个答案:

答案 0 :(得分:1)

备选方案2显然更优越 - 如果您没有获得任何好处,为什么要增加课程的开销?

但是,如果您确实想这样做,请考虑制作Fooer的方法@staticmethod

class Fooer(object):

    @staticmethod
    def foo(x):
        ...
        return _foo_helper(x)

    @staticmethod
    def _foo_helper(x):
        ...
        return y

因此,您不需要创建实例,也不需要使用self / cls个参数:

from fooer import Fooer

y = Fooer.foo(x)