这篇文章基于Writing Friendlier Clojure,作者Adam Bard展示了重构实现一阶单词级Markov 文本生成器的一些 Clojure 代码的方法。
使命是使这段代码更具可读性:
markov-data
函数接受一个字符串,返回一个哈希图,其键是字符串中的单词,值是键后紧接着的单词序列,实现了一阶单词级 Markov 过程,特殊键:start
表示所有开始句子的单词。- 重构过程:先写一个处理单个句子的函数
process-sentence
,使用reduce
处理句子中的单词并更新哈希图;再用reduce
处理输入字符串text
,拆分字符串并对每个句子调用process-sentence
;最后重构sentence
函数,用递归替代loop
,增加变量名可读性和向向量添加元素的惯用方式。 - 还给出了
markov-data
和sentence
函数的一系列表征测试,用于确保代码行为不变,如处理空字符串、单个单词、多个句子等情况,以及考虑 Markov 过程随机性的测试。 - 引用了相关的文章、作者、资料等,如Working Effectively with Legacy Code、characterization tests、clojure.spec等。最终重构后的代码更易读且可维护。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。