开发者工具·文本比较
在审查代码时将格式噪声与实际更改分开
· 为什么它很重要
文本差异 代码审查 空白
解释了为什么将重新格式化与逻辑更改混合在一起会隐藏错误,以及空白不敏感的比较如何让您首先查看实质内容。
400 行更改,实际上是四行 - 打开时进行没人愿意做的审查
格式化程序运行可以将四行逻辑编辑转换为数百个已更改的行。然后审查注意力从行为转移到大括号、缩进和换行。第二个空白不敏感视图可以公开剩余的文本更改,但它不能证明这些更改是唯一的行为更改。
保留普通审核记录。 ToolAcre 的选项会修剪和压缩每个行键,同时保留行边界和原始显示文本。它是已知文件的噪声透镜,而不是将格式与语义分开的解析器。
为什么格式和逻辑应该分开审查——解释了当真正的变化隐藏在表面变化之中时注意力是如何下降的
当工作流程允许时,格式和逻辑应该单独提交,因为审阅者可以独立推理每个意图。当它们组合在一起时,将格式化程序输出与原始输出进行比较,然后将最终代码与格式化基线进行比较。
这种三态方法比一种激进的标准化方法更强。它标识了格式化程序生成的内容以及作者随后更改的内容。两个文本浏览器工具可以支持每一对,而版本控制仍然是提交和审查历史记录的权威工作流程。
空白不敏感比较保留的内容 — 描述仍然显示的内容:更改的标识符、值、运算符和重新排序的语句
当规范化行键不同时,空白不敏感匹配仍然会公开更改的标识符、文字、运算符和行顺序。它还保留添加或删除的行。由于空格被压缩而不是被删除,因此 `ab` 和 `a b` 仍然是不同的键。
该选项仍然可以隐藏前导缩进、尾随空格以及内部空白运行之间的更改。这些在 Python、YAML、Makefile、固定宽度数据、字符串文字和其他上下文中是有意义的。 diff 没有语法来区分安全格式和有效间距。
工作示例:格式化程序运行加上错误修复 - 比较带有和不带有空格选项的函数的两个版本以隔离实际修复
对函数运行格式化程序,然后将 `limit < 10` 更改为 `limit <= 10`。普通模式可能会显示每个重新缩进的行;空白模式应该使按键安静,唯一的区别是空格,同时让操作员编辑作为删除加添加对。
在批准之前检查该操作员周围的严格视图。如果语言允许行延续或缩进敏感块,则尽管规范化匹配,格式更改仍可能影响行为。 ToolAcre 报告行文本,而不是编译或控制流。
忽略代码中空格的限制 - 注释缩进敏感的语言和字符串文字,其中空格有意义
Python 块缩进和 YAML 嵌套是明显的危险。正则表达式、shell here-documents、Markdown 代码块或面向用户的字符串文字中的空格也同样有意义。对空白不敏感的结果不应该成为这些区域的唯一审查。
运行两个通道并将分歧视为信息。如果严格模式发生变化但规范化模式没有变化,则使用语言的实际规则对区域进行分类。不要仅仅从消失就推断无害;该选项仅在其记录的转换后证明相等。
将代码从审查工具中取出并进行快速比较 - 解释了当审查界面自己的噪声过滤器不可用时粘贴两个版本
当托管接口缺乏足够的噪声过滤器时,请将一个小的非秘密区域复制到浏览器工具中。保留足够的未更改上下文以对齐编辑,并避免在批准的审核环境之外粘贴凭据或专有文件。
折叠长时间未更改的运行可以使远程编辑更易于扫描。它围绕当前 UI 中的更改保留三个上下文行,并插入长相等范围的跳过计数。这只是演示;完整的底层行列表仍然可供补丁下载。
这不包括什么 - 语法突出显示、理解语言语义或替换版本控制审核工作流程
文本差异不提供语法突出显示、语言语义、编译器检查或重命名检测。它不能取代拉请求审查、测试或静态分析。移动的函数可能会被删除和添加,并且不区分大小写的传递可以隐藏区分大小写的标识符更改。
使用此页面作为聚焦的辅助视图。源的 O(n·m) LCS 适用于有界差分中间,而不是在任意存储库上即时性能的无条件承诺。整个项目审查属于为存储库和语言结构构建的工具。
要点:先回顾实质内容,然后再回顾风格 — 总结使用 ToolAcre 的文本比较切换空白选项的两遍方法
通过两次明确的审查内容和风格。首先保留精确的字符;然后启用空白规范化来定位幸存下来的更改。使用语言的规则而不是复选框的结果来解释任何隐藏区域。
这一学科将嘈杂的比较变成了问题列表,而不假装格式普遍都是装饰性的。 ToolAcre提供透明行操作和原始行。编译器、测试和人工审查提供了文本比较器无法提供的行为证据。