iTunes 是苹果公司提供的内容商店服务,在里面可以购买世界各地的电影、音乐等数字内容。同时,iTunes 还提供了一个公开的可免费调用的内容查询 API。下面这个脚本就通过调用该 API 实现了查找歌手的第一张专辑的功能:
1 | ITUNES_API_ENDPOINT = 'https://itunes.apple.com/search' |
函数的长度、圈复杂度、嵌套层级都在合理范围内,但是,除了这些维度外,评价函数好坏还有一个重要标准:函数内的代码是否在同一抽象层内。command_first_album() 显然不符合这个标准,在函数内部,不同抽象级别的代码随意混合在了一起:
- 函数代码的说明性不够:如果只是简单读一遍 command_first_album(),很难搞清楚它的主流程是什么,因为里面的代码五花八门,什么层次的信息都有;
- 函数的可复用性差:假如现在要开发新需求——查询歌手的所有专辑,你无法复用已有函数的任何代码;
要优化这个函数,我们需要重新梳理程序的抽象级别,在我看来,这个程序至少可以分为以下三层:
- 专辑数据层:调用 API 获取专辑信息;
- 第一张专辑层:找到第一张专辑;
- 用户界面层:处理用户输入、输出结果;
1 | ITUNES_API_ENDPOINT = 'https://itunes.apple.com/search' |
在设计函数时,请时常记得检查函数内代码是否在同一个抽象级别,如果不是,那就需要把函数拆成更多小函数。只有保证抽象级别一致,函数的职责才更简单,代码才更易读、更易维护。