如何进行正确的 CodeReview

软件开发生命周期中至关重要的一步是代码审查。它使开发人员能够显著提升代码质量。它类似于书籍的创作过程。首先,作者写故事,然后经过编辑以确保不会出现诸如混淆“you’re”和“yours”之类的错误。在这个语境中,代码审查指的是检查和评估他人的代码。它基于拉取请求模型,这个模型在开源项目中广受欢迎。

代码审查有不同的好处:

确保设计和实现的一致性,•优化代码以提升性能,•是学习的机会,•知识分享和指导,以及促进团队凝聚力。

代码审查中需要检查的内容

代码审查有不同的好处:

在代码审查中应该查找什么?有许多不同的事项需要检查,从重要性的不同层次自动化的可能性来看:

尝试查找以下内容:

1.功能性和设计 — 这里,我们需要找到答案,比如:这个更改是否遵循我们期望的架构,或者它是否与系统的其他部分集成良好?它的组件之间是否具有高内聚性和低耦合性?它是否遵循了如OO、SOLID、DRY、KISS、YAGNI等健壮的原则?2.实现 — 在这里,我们检查解决方案是否在逻辑上正确(它确实改变了开发人员的意图),如果代码比应有的复杂,等等。这段代码是否必要?我们还要检查是否使用了良好的设计模式。以及关键的内容,例如API入口点。3.测试 — 在这里,我们检查是否所有测试都通过了,我们是否对所有代码路径和行为使用单元测试,并对外部系统(数据库、文件系统等)使用集成测试。我们是否检查了所有边界条件和代码覆盖率在60-80%之间?4.文档 — 我们的PR描述添加了吗?我们的解决方案在存储库的README.md或其他地方是否有文档更新?5.代码风格 — 我们是否遵循了项目的代码风格?您是否知道命名是否良好?开发人员是否为类、方法等选择了确切的名称?代码是否易读?

f61f818808c2167c68734f700f96f144.png
1*pRrZW9PzCcRTWgDuWYOaUQ.png

代码审查金字塔(基于Gunnar Morling的原始作品)

进行代码审查的一些良好实践

以下是进行代码审查时的一些良好实践:

1.尝试首先审查您自己的代码

在将代码发送给同事之前,尝试先阅读和理解它。寻找让您困惑的部分。在IDE之外查看您的代码通常有助于将其视为“新”的东西,从而避免操作性盲点

1.编写更改的简短描述

这应该以高层次解释更改内容以及为何进行这些更改的方式来解释。

1.自动化可以自动化的部分

将所有可以自动化的工作留给系统,例如检查成功构建(CI)、样式更改(代码检查器)、自动化测试和静态代码分析(例如使用SonarQube)。我们已将其集成在PR级别,因此它将在每个PR上运行并为代码合并提供阻碍。这将使我们能够消除不必要的讨论,为更重要的讨论留出空间。

1.为更大的任务与团队成员进行启动会议

如果您开始处理更大的任务,特别是在设计方面,请尝试首先与代码所有者或将成为您的代码审查者的人进行启动会议。这将在实施之前达成共识,并减少在PR审查阶段的工作量,避免出现意外情况。

1.不要着急

您需要了解其周围发生了什么 — 每一行代码。如果需要,逐类多次阅读。应该查看分配给审查的每一行代码。有些代码需要更多的思考,有些则需要更少,但这是我们在审查过程中必须做出的决定。如果需要,为口头讨论保持自己的时间。

1.友善地评论

永远不要提及个人(您),始终将注意力集中在更改上,以问题或建议的形式提出,并留下至少一个积极的评论。用您的话解释“为什么”,并建议如何改进。

1.在足够好时批准PR

不要追求完美,但要保持高标准。不要小题大做。

1.控制审查的规模

我们应该限制一次审查的代码行数。PR应该包含尽可能少的更改文件。我更喜欢更小的增量更改而不是重大的更改。我们的大脑无法一次处理那么多信息。每次审查的核心行数的理想数量是200到400行,通常是60到90分钟。如果任务庞大,请将其细分为可以快速审查的较小子任务。

df4f303abf195fd8b9af72f6c953bca0.png
1*mNzibJnKgyYZcI4SyqkjQw.png

1.使用工具

对于所有代码审查,您应该使用一些工具,例如BitBucket、Azure DevOps、GitHub或GitLab。例如,Microsoft多年来一直使用名为CodeFlow的内部工具,它支持开发人员并指导他们完成所有代码审查步骤。它在代码准备阶段有所帮助,自动通知审阅者,并具有丰富的评论和讨论功能。在后来的几年里,他们转向了GitHub拉取请求。Google也在代码审查方面使用两种解决方案。他们使用Gerrit代码审查工具进行开源代码审查,但在内部代码方面,他们使用名为Critique的内部工具。

代码审查的更好替代方案

除了传统的PR审查之外,还有另一种模型可以帮助您在编码过程中获得更高的效率和速度。它基于一种不同于拉取请求的模型,称为基于主干的开发。在这里,您同步进行代码审查。通过这种方式,所有开发人员都在主线分支上工作,频繁提交更改。这种做法的一个例子是协作编程方法(配对编程和集体编程),是由Kent Beck在90年代作为极限编程技术引入的。

d8e9e9cb48d3a543d6fbb8f0ca319956.jpeg
Image.jpeg

配对编程(来源:Unsplash)

配对编程和集体编程是协作编程方法,涉及两个或多个开发人员共同处理单个任务,共享编写代码时的想法和思路。在这里,一个开发人员充当驱动者(编写代码)的角色,而另一个则充当导航者的角色(确保代码准确性)。在过程中他们会定期交换位置

与传统代码审查相比,这些方法提供了多种好处

实时反馈:配对编程和集体编程使开发人员能够即时获得有关其代码的反馈,从而能够解决问题并改进。这与传统的代码审查不同,后者可能要等到代码审查阶段才会收到反馈。•增强的知识共享:协作编程使开发人员能够从彼此的经验和知识中学习,从而带来更好的代码和技能发展。这在使用新技术或面对新手时特别有用。此外,学习更容易在团队成员之间传播,降低了单个开发人员成为瓶颈的风险。•更快的问题解决鼓励开发人员共同解决问题,从而获得更快、更高效的解决方案。这可以减少开发时间并改善项目结果。•增强的关注和生产力:与另一位开发人员密切合作可以帮助保持专注并减少分心。•提高代码质量:当多个开发人员共同合作时,他们更有可能在开发早期发现错误和设计问题,进而提高代码质量。

这种方法在拥有大部分资深开发人员的团队,必须快速迭代的情况下效果最佳。然而,如果团队主要由初级开发人员组成,或者产品较为复杂需要多人审核代码时,Pull Request 模型更为适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python项目——计算器(PySide6+Pyinstaller)

1、介绍 使用python编写一个计算器,可以实现基本的运算。【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。 2、实现 使用pyCharm创建一个新的项目。 2.1、设计UI 使用Qt designer设计一个UI界面,保存ui文件&#xff0…

直流过欠压继电器JSZD-1A DC220V 0-220V 面板嵌入式安装

一、 概述 JSZD-1系列直流电压继电器是专为直流系统设计的,以进口大规模集成电路为核心,配以本厂研制的模块和部分外围元件组装而成。具有通用性好、互换性强、寿命长、外形美观大方、性能稳定可靠等特点。 JSZD-1系列直流电压继电器既是一块过、欠压继…

Python 类变量和实例变量详解

更多资料获取 📚 个人网站:ipengtao.com 在Python中,变量分为类变量和实例变量两种类型,它们有着不同的作用范围和生命周期。理解这两种变量类型的区别对于面向对象编程非常重要。本文将详细介绍Python中的类变量和实例变量&…

CentOS7 LAMP环境安装部署Zabbix

CentOS7 LAMP环境安装部署Zabbix 查看CentOS版本号 more /etc/redhat-release server 最好配置静态IP地址、DNS,在DHCP服务器将此IP地址排除掉。 Hostname 改为zabbix 服务端:172.20.26.137 客户端:172.20.26.113 Zabbix服务端安装及配…

3.postman动态参数、文件上传及断言

一、postman内置动态参数以及自定义的动态参数 postman内置动态参数: {{$timestamp}} 生成当前时间的时间戳 {{$randomint}} 生成0-1000之间的随机数 {{$guid}} 生成随机guid字符串 自定义动态参数: 在请求中pre-req页面下 //手动的获得时间戳 var…

四个简单的bat脚本

Windows11 最大劝退点就是这个右键菜单,复制粘贴都变成一点点的小图标,最气人的是点击底部的显示更多选项才能展示全部功能。让许多本来点一次就能完成的操作变成两次。其实使用一个小命令就能修改回win10版本的菜单。四个简单的bat脚本,能完…

探索指针的奇妙世界,程序中的魔法箭头(上)

目录 一.指针是什么二.指针和指针类型1.指针加减整数2.指针的解引用 三.野指针1.野指针形成的原因(1)指针未初始化指针越界访问 2.如何规避野指针(1)指针初始化(2)小心指针越界(3)指…

第七回 林教头刺配沧州道 鲁智深大闹野猪林-FreeBSD/Linux图形界面安装配置

高俅定林冲:手持利刃,故入节堂,杀害本官的罪名,将林冲押解去开封府,暗示开封府将林冲处决。 开封府负责办案的叫孙定,他为人刚正不阿,宅心仁厚。在他的据理力争之下,开封府尹最终对…

【计算机网络】TCP握手与挥手:三步奏和四步曲

这里写目录标题 前言三次握手四次挥手三次握手和四次挥手的作用TCP三次握手的作用建立连接防止已失效的连接请求建立连接防止重复连接 TCP四次挥手的作用:安全关闭连接避免数据丢失避免半开连接 总结: 总结 前言 TCP(传输控制协议&#xff09…

终极解决Flutter项目运行ios项目报错Without CocoaPods, plugins will not work on iOS or macOS.

前言 最近在开发Flutter项目,运行ios环境的时候报错没有CocoaPods,安卓环境可以正常运行,当时一脸懵逼,网上搜索了一下,有给我讲原理的,还有让我安装这插件那插件的,最终把电脑搞得卡死&#x…

25计算机考研408专业课复习计划

点击蓝字,关注我们 今天要分享的是25计算机考研408专业课复习计划。 以下内容供大家参考,大家要根据自己的复习情况进行适当调整。 统考与自命题 统考科目是指计算机学科专业基础综合(408),满分150分,试…

鸿蒙开发环境配置-Windows

背景 入局鸿蒙开发,发现在 Windows 下面配置安装相关环境并没有像 Mac 一样简单,过程中遇到了一些问题记录一下。 Devceo Studio 下载安装 目前鸿蒙的 IDE 最新版是 4.0,通过这个连接可以下载,鸿蒙4.0下载连接。选择符合我们电…

【设计模式】责任连模式怎么用?

我将通过一个贴近现实的故事——请假审批流程,带你了解和掌握责任链模式。 什么是责任链模式? 责任链模式是一种行为设计模式,它让你可以避免将请求的发送者与接收者耦合在一起,让多个对象都有处理请求的机会将这个对象连成一条…

Qt拖拽事件简单实现

1.相关说明 重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数)&#xff0c;可以将本地图片拖拽到label标签中 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h" #include <QDragEnterEvent>…

【cucumber】cluecumber-report-plugin生成测试报告

cluecumber为生成测试报告的第三方插件&#xff0c;可以生成html测报&#xff0c;该测报生成需以本地json测报的生成为基础。 所以需要在测试开始主文件标签CucumberOptions中&#xff0c;写入生成json报告。 2. pom xml文件中加入插件 <!-- 根据 cucumber json文件 美化测…

beego API 自动化文档

API 全局设置 必须设置在 routers/router.go 中&#xff0c;文件的注释&#xff0c;最顶部&#xff1a; // APIVersion 1.0.0 // Title mobile API // Description mobile has every tool to get any job done, so codename for the new mobile APIs. // Contact astaxiegmai…

Unity中ShaderGraph下获取主灯

文章目录 前言一、ShaderGraph获取主灯1、创建ShaderGraph2、创建一个自定义方法&#xff08;Custom Function&#xff09;节点3、新建两个 Vector3 类型的输出变量4、选择自定义节点程序体为 string 类型5、编写程序体6、我们输出主光方向看看效果7、我们输出主光颜色看看效果…

1.11马原

同一性是事物存在和发展的前提&#xff0c;一方的发展以另一方的发展为条件 同一性使矛盾双方相互吸收有利于自身的因素&#xff0c;在相互作用中各自得到发展 是事物发展根本规律&#xff0c;唯物辩证法的实质和核心 揭示了事物普遍联系的根本内容和变化发展的内在动力 是贯…

Visual Studio 设置编辑框(即代码编辑器)的背景颜色

在Visual Studio 中设置编辑框&#xff08;即代码编辑器&#xff09;的背景颜色&#xff0c;可以按照以下步骤进行&#xff1a; 打开Visual Studio。在菜单栏上找到并点击“工具”(Tools)选项。在下拉菜单中选择“选项”(Options)。在“选项”对话框中&#xff0c;导航至“环境…

设计模式-资源库模式

设计模式专栏 模式介绍模式特点应用场景资源库模式与关系型数据库的区别代码示例Java实现资源库模式Python实现资源库模式 资源库模式在spring中的应用 模式介绍 资源库模式是一种架构模式&#xff0c;介于领域层与数据映射层&#xff08;数据访问层&#xff09;之间。它的存在…