本节书摘来自异步社区《像计算机科学家一样思考Python》一书中的第4章,第4.7节,作者[美]Allen B. Downey,赵普明 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
当我写circle函数时,我可以复用polygon,因为边数很多的正多边形是圆的很好的近似。但是arc则并不那么容易对付;我们不能使用polygon或者circle来画圆弧。
一个选择是先复制一个polygon函数,再通过修改得到arc函数。结果可能类似下面的示例:
def arc(t, r, angle): arc_length = 2 * math.pi * r * angle / 360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n for i in range(n): fd(t, step_length) lt(t, step_angle)这个函数的第二部分很像polygon的实现,但如果不修改polygon的接口,无法直接复用。我们也可以泛化polygon函数以接受第三个参数表示圆弧的角度,但那样的话polygon(多边形)就不是合适的名称了! 所以,我们将这个更泛化的函数称为polyline(多边线):
def polyline(t, n, length, angle): for i in range(n): fd(t, length) lt(t, angle)现在我们可以重写polygon和arc,让它们调用polyline:
def polygon(t, n, length): angle = 360.0 / n polyline(t, n, length, angle) def arc(t, r, angle): arc_length = 2 * math.pi * r * angle / 360 n = int(arc_length / 3) + 1 step_length = arc_length / n step_angle = float(angle) / n polyline(t, n, step_length, step_angle)最后,我们可以重写circle,改为调用arc:
def circle(t, r): arc(t, r, 360)这个过程——重新组织程序,以改善函数的接口,提高代码复用——被称为重构(refactoring)。在这个例子里,我们注意到arc和polygon中有类似的代码,因此我们把它们的共同之处“重构出来”抽取到polyline函数中。
如果我们早早计划,可能会直接先写下polyline,也就避免了重构,但实际上在工程开始时我们往往并没有足够的信息去完美设计所有的接口。开始编码之后,你会更了解面对的问题。有时候,重构正意味着你在编程中掌握了一些新的东西。
相关资源:敏捷开发V1.0.pptx