Niels-Bom 写道(有编辑):
只需在循环中逐行读取规则文件,并对读取的每一行进行搜索/替换,即可获得相同的结果。
事实上,这基本上是在第 6.5 节中完成的,其中规则放置在文件plural4-rules.txt 中。现在规则作为字符串可以在文件中维护,我们的代码将数据与控制分开。这使项目更易于管理和维护。
Niels 的问题促使我勾勒出第 6 章的发展,以便准确理解作者试图展示的内容。在所提供的开发中可以学到很多经验教训,这不仅仅是关于闭包,还有关于编码的最佳实践。
该练习帮助我了解了如何使用生成器来替代替代的、不那么抽象且更复杂的实现。从 6.2 到 6.6 的材料发展具有足够的教育意义,可以在这里勾勒出来。
所以我从 Niels 的第二点开始,即在 6.3 中将规则分解为单独的函数,作为草图的延续:
为什么在这个例子中使用闭包可以改进代码?
作者此时表示:
添加这种抽象级别值得吗?嗯,还没有。
仍有部分 6.4-6.6 需要完成。闭包的故事,在这种情况下,构建复数生成器是逐步实现的,从称为复数(名词)的模块中的硬编码规则开始。因此,从第一个相关部分开始,总结我们到本章结尾的方式,我们有以下内容。
6.2 让我们使用正则表达式:作者借此机会通过在初始复数函数中硬编码的复数规则来加强和扩展我们对正则表达式的理解。
6.3。函数列表:将复数函数中硬编码的规则抽象为几个独立的函数。这是下一节的“垫脚石”。但这也说明了match_sxz()和match_sxz的用法有一个重要的区别。
6.4 模式列表:我们在 6.3 中创建了单独的命名函数,配对为 match 和 apply,这一事实是多余的。这些函数都基于相同的模式,从不直接调用。在这里,他修改了这段代码,以便更简单地更改规则。这成为更深层次的抽象,现在将规则指定为称为模式的变量中的字符串。复数规则不再是函数。
6.5 模式文件:不再有重复的代码和在字符串列表中定义的复数规则,构建生成器的下一步是将这些字符串放在单独的文件中。在这里,它们变得更易于维护,与使用它们的代码分开。
6.6 生成器:生成器是一个通用的复数() 函数,它解析规则文件、检查匹配、应用规则(如果合适)并转到下一个规则。这是一个闭包的例子。
这就是plural()函数必须做的,也是plural()函数应该做的。
一个相对简单而漂亮的开发,足够复杂以至于有用,并且可以扩展到人们可能会发现的其他类型的问题,尤其是在文本模式识别方面。
作者在教程结尾处解决了此特定解决方案的性能问题。从文件中打开和读取行会降低性能,尤其是在 open() 调用数量增加的情况下。他指出,使用迭代器可以获得更好的性能,本书后面会提到。