1

我正在通过 SICP 工作,并且一直在阅读 Code Complete。在 Code Complete 中,我学会了尽可能地抽象和结构化事物。在 SICP 中,我学会了为每个可能被抽象为一个的任务创建“辅助”函数。无论如何,我的问题:我有一个班级“A”,应该能够完成任务“b”、任务“c”和任务“d”。所以我创建了 3 个方法,“b”、“c”和“d”。这些方法中的每一个都必须执行的任务相当复杂,但符合我的类和其他代码提供的抽象级别(例如,类抽象数据库访问,而不是A.findEmployee('Steve')返回列表或其他低级数据类型,它返回一个 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

它很好地隐藏了子功能,看起来相当不错,但我很少在任何代码中看到这一点,所以我不确定这是否是正确的方法。你怎么看?

4

1 回答 1

3

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

因此,您将希望创建没有“Employee”前缀的 EmployeeDB 方法:find()、fetch() 和 returnInstance()

仅当您确实需要扩展函数的范围并且该函数不会被其他方法使用时,才使用闭包。当我想返回函数时,我发现闭包很方便。

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

于 2013-06-22T11:49:51.513 回答