我正在通过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
它很好地隐藏了子函数,看起来相当不错,但我很少在任何代码中都看到这个,所以我不确定这是不是正确的方法。你觉得怎么样?
答案 0 :(得分:3)
我的意见是你不需要在其方法中重复(部分)类名,因为在可能的情况下你将无法使用鸭子类型。
因此,您需要创建EmployeeDB的方法而不使用“Employee”-prefix:find(),fetch()和returnInstance()
只有当你真的需要扩展函数的范围,以及其他方法不会使用该函数时,才使用闭包。当我想要返回功能时,我发现闭包很方便。
我认为您会发现使用闭包通常会减少代码重用(“不要重复自己”)。