如何将方法的部分抽象为“子方法”(Python)

时间:2013-06-22 11:22:55

标签: python coding-style

我正在通过SICP工作,并且已经阅读了Code Complete。在Code Complete中,我学会了尽可能地抽象和构造事物。在SICP中,我学会了为每个可能被抽象为一个任务的任务创建“辅助”函数。无论如何,我的问题是:我有一个“A”类,应该可以执行任务“b”,任务“c”和任务“d”。所以我创建了3个方法,“b”,“c”和“d”。每个方法必须完成的任务相当复杂,但符合我的类和其他代码提供的抽象级别(例如,类抽象数据库访问,而不是让A.findEmployee('Steve')返回列表或其他低-level data-type,它返回一个Employee实例)。 findEmployee方法可以(也应该在我看来)分成不同的部分。例如,它可以调用两个函数fetchEmployeeData('Steve')returnEmployeeInstance(employeedata)。 但是只需将所有这些功能放在一个类中,如下所示:

class EmployeeDB(object):
  def findEmployee(self,name):
    employeedata=self._fetchEmployeeData(name)
    employeeinstance=self._returnEmployeeInstance(employeedata)
    return employeeinstance
  def _fetchEmployeeData(self,name):
    pass
  def _returnEmployeeInstance(self,employeedata):
    pass

使结构化程度降低,并没有真正帮助提高凝聚力。 在这种情况下,构建代码的适当方法是什么?

感谢您的时间。

编辑:我刚才意识到我可以这样做:

class EmployeeDB(object):
  def findEmployee(self,name):
    def fetchEmployeeData(name):
      pass
    def returnEmployeeInstance(employeedata):
      pass

    employeedata=fetchEmployeeData(name)
    employeeinstance=returnEmployeeInstance(employeedata)
    return employeeinstance

它很好地隐藏了子函数,看起来相当不错,但我很少在任何代码中都看到这个,所以我不确定这是不是正确的方法。你觉得怎么样?

1 个答案:

答案 0 :(得分:3)

我的意见是你不需要在其方法中重复(部分)类名,因为在可能的情况下你将无法使用鸭子类型。

因此,您需要创建EmployeeDB的方法而不使用“Employee”-prefix:find(),fetch()和returnInstance()

只有当你真的需要扩展函数的范围,以及其他方法不会使用该函数时,才使用闭包。当我想要返回功能时,我发现闭包很方便。

我认为您会发现使用闭包通常会减少代码重用(“不要重复自己”)。