概述
依据对ripgrep的学习,实现简单的个人版本的tbt_ripgrep,简单的有以下功能
- 基本搜索
- 添加选项(忽略大小写,行号)
- 彩色输出
- 支持递归搜索目录
- 支持正则表达式
- 显示上下文
- 性能优化(加多线程,优化大文件处理,做性能对比)
功能实现
命令行参数解析使用的clap库,彩色输出也是用的colored库,正则匹配也是用的regex库,基于上述三个库提供的功能,功能实现的主要难点主要在上下文显示与递归搜索目录。其中递归搜索目录也是基于walkdir库实现的,但是主要是想学习ripgrep的目录发现思路。
程序对比
ripgrep的职责分离做的很好,以Searcher为例,如果以我自己的想法的话,是会把Path放进Searcher中的,但是这样会这样,search方法就需要处理文件系统问题,包括但不限于以下内容,但那些都不是搜索的核心逻辑:- 需要处理文件系统错误
- 需要处理符号链接
- 需要处理文件类型判断
- 基于以上的差异,本质上是我没有做好职责分离,我是基于“是什么”去实现功能的,但是
ripgrep是基于“做什么”去实现代码的,做好职责分离,感觉也算是面向抽象编程的殊途同归了吧。 - 显示上下文虽然功能是实现了,但是设计的不是很优雅,单个文件的搜索结果都会存储下来,然后统一打印出来,单个匹配文件过多的时候,效率低下的缺点就会放大了,目前对
ripgrep的实现还不是很清楚,但是很好奇是如何实现的。ripgrep是如何做到流式处理 + 上下文功能处理的呢? ripgrep的walk实现也是很值得学习的,我原本的实现也就是对walkdir返回的迭代器进行遍历就行,但是ripgrep对文件遍历进行了功能处理,WalkBuilder,WalkEventIter和Walk都是,我觉得这些都是很值得学习的
优先考虑做什么而不是是什么去实现功能,面向行为编程优于面向对象编程,做好职责分离。