更大型的例子
我们做过一个网页爬虫系统,会在下载每个网页后调用一个叫UpdateCounts()的函数来增加不同的统计数据:
哦,那是我们希望代码成为的样子!
实际上,HttpDownload对象没有上面所示的任何方法。相反,HttpDownload是一个非常大并且非常复杂的类,有很多嵌套类,并且我们得自己把它们挖出来。更糟糕的是,有时有些值谁不知道是什么,这种情况下我们只能用"unknown"作为默认值。
由于这些原因,实际的代码非常乱:
如你所见,代码很多,逻辑也很多,甚至还有几行重复的代码。读这种代码一点也不有趣。
特别是,这段代码在不同的任务间来回切换。下面是代码里通篇交织着的几个任务:
1.使用"unknown"作为每个键的默认值。
2.检测HttpDownload的成员是否缺失。
3.抽取出值并将其转换成字符串。
4.更新counts[]。
我们可以通过把其中一些任务分割到代码中单独的区域来改进这段代码:
如你所见,这段代码有三个分开的区域,各自目标如下:
1.为我们感兴趣的三个键定义默认值。
2.对于每个键,如果有的话就抽取出值,然后把它们转换成字符串。
3.对于每个键/值更新counts[]。
这些区域好的地方是它们互相之前是独立的——当你在读一个区域时,你不必去想其他的区域。
请注意尽管我们列出4个任务,但我们只能拆分出3个。这完全没问题:你一开始列出的任务只是个开端。即使只拆分出它们中的一些就能对可读性有很大帮助,就像这个例子中一样。
进一步的改进
对于当初的大段代码来讲这个新版本算是有了改进。请注意我们甚至不用创建新函数来完成这个清理工作。像前面提到的,“一次只做一件事情”这个想法有助于不考虑函数的边界。
然而,也可以用另一种方法改进这段代码,通过引入3个辅助函数:
这些函数会抽取出对应的值,或者返回"unknown"。例如:
请注意在这个做法中甚至没有定义任何变量!像第9章所提到的那样,保存中间结果的变量往往可以完全移除。
在这种方法里,我们简单地把问题从不同的角度“切开”。两种方法都很有可读性,因为它们让读者一次只需要思考一件事情。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论