且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《像计算机科学家一样思考Python》——4.6 接口设计

更新时间:2022-09-23 12:06:43

本节书摘来自异步社区《像计算机科学家一样思考Python》一书中的第4章,第4.6节,作者[美]Allen B. Downey,赵普明 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

4.6 接口设计

下一步是写画圆的circle函数,接受形参r,表示圆的半径。下面是一个简单的例子,通过调用polygon函数画50边的多边形:

def circle(t, r):
  circumference = 2 * math.pi * r
  n = 50
  length = circumference / n
  polygon(t, n, length)

第一行计算半径为r的圆的周长,使用公式2πr。因为我们使用的是math.pi,所以需要先导入math模块。依照惯例,import语句一般都放在脚本开头。

n是我们用于近似画圆的多边形的边数,所以length是每个边的长度。因此,polygon画出一个50边形,近似于一个半径为r的圆。

这个解决方案的缺点之一是n是一个常量,因此对于很大的圆,多边形的边线太长,而对于小圆,我们又浪费时间去画过短的边线。解决办法之一是泛化这个函数,加上形参n。这样可以给用户(调用circle函数的人)更多的控制选择,但接口就不那么清晰简洁了。

函数的接口是如何使用它的概要说明:它有哪些参数?这个函数做什么?它的返回值是什么?我们说一个接口“简洁”(clean),是希望它“尽可能简单,但不能过度。(爱因斯坦)”。

在这个例子里,r属于函数的接口,因为它指定了所画的圆的基本属性。相对地,n则不那么适合,因为它说明的是如何画圆的细节信息。

所以与其弄乱接口,不如在代码内部根据周长来选择合适的n值:

def circle(t, r):
  circumference = 2 * math.pi * r
  n = int(circumference / 3) + 1
  length = circumference / n
  polygon(t, n, length)

现在多边形的边数(近似)是circumference/3,所以每个边长(近似)是3,已经小到足够画出好看的圆形,但又足够大到不影响画线效率,并且适合于任何尺寸的圆。