当一个大方法的组件本身没有意义时,如何重构一个大方法呢?

时间:2014-08-01 03:41:15

标签: python refactoring

我想在django models.Manager上重构一个非常大的方法。为了清楚起见(以及我的理智),我想将其分解为其组成部分。

此方法接受一个对象,使用该对象的信息加载网页,并根据该页面的内容从数据库中返回一个新的或现有的对象。


让我们假设我正在尝试获取与某个网页相对应的Vehicle。除其他事项外,这可能涉及:

  • 加载有问题的页面
  • 从页面
  • 中查找车辆名称
  • 确定匹配的车辆是否已经存在
  • 确定我可以描绘车辆的所有不同颜色,以及自从我上次查看页面后它们是否已经改变

目前,方法签名可能如下所示:

class VehicleManager(models.Manager):
    def getForSale(self, sale):
        # lots and lots of code

我想将其分解为更小的方法,每个方法都执行上述要点之一。


我遇到的概念问题是我不确定在哪里放置较小的方法。它们似乎不属于VehicleManager,因为:

  • 他们不能到一组Vehicle个对象(例如,Vehicle.objects.findNameOnPage是无意义的)
  • 他们中的很多人甚至不使用实例变量

我可以想出几种重构方法:

  • 只需创建以下划线为前缀的新方法,例如:

    def _findNameOnPage(self, page): # self is not used
    

    这种方法的问题在于这些方法比真正的方法更具实用功能。

  • 创建静态方法:

    @staticmethod
    def _findNameOnPage(page):
    

    这会将方法与类(好)相关联,但这样做会混淆命名空间(坏)。

  • 将方法放置为模块范围

    这不会使命名空间混乱(好),但也使得方法与类(坏)相关联不太清楚。


在python中是否有可接受的模式/方法?

0 个答案:

没有答案