当前位置:首页 > 科技  > 软件

vivo 互联网自研代码评审 VCR 落地实践

来源: 责编: 时间:2024-06-27 17:19:23 264观看
导读代码评审是软件质量保证一种活动,由一个或者多个人对一个程序的部分或者全部源代码进阅读理解。一般来说分为作者和评审者两种角色,作者方提供代码逻辑的介绍和代码,评审者则对提供的代码基于设计,功能性和非功能性等方面

OiQ28资讯网——每日最新资讯28at.com

代码评审是软件质量保证一种活动,由一个或者多个人对一个程序的部分或者全部源代码进阅读理解。一般来说分为作者和评审者两种角色,作者方提供代码逻辑的介绍和代码,评审者则对提供的代码基于设计,功能性和非功能性等方面认知进行阅读并提出问题。常见的评审组织形式是有同行评审(Peer Review)和小组检查 (Team Inspection)两种方式。OiQ28资讯网——每日最新资讯28at.com

在代码评审中,评审的目的在通过代码的评审发现潜在的问题,同时分享和表达是代码评审的重要收获,我们知道人相同在不同的文化下生产力是不同的,代码评审是一个工具,工具受文化的影响的同时也影响着文化,最终朝着我们希望的责任共担、持续改进的方向发展。OiQ28资讯网——每日最新资讯28at.com

一、代码评审演进


OiQ28资讯网——每日最新资讯28at.com

4)插件运行调试打包安装OiQ28资讯网——每日最新资讯28at.com

Gradle构建方式进行调试打包安装OiQ28资讯网——每日最新资讯28at.com

运行/调试:runIde 可以选择Debug模式或者是Run模式OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

打包OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

安装:可以将打的包发布市场(本地idea配置插件仓库),从Marketplace搜索插件或者是直接从Settings->plugins->Install->Install Plugin from Disk安装OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

步骤2:研究Gerrit插件源码,搞清楚整理开发流程和模块OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

步骤3:基于Gerrit插件规划VCR插件模块,增加clone、branch、mergeRequest、VCR模块,并对各组件增强OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

步骤4:定制原有流程模块push,自动化关联工作项OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com


OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

在使用Git依赖插件之前,先了解一下插件的扩展以及扩展点(Extensions、Extension Points)。OiQ28资讯网——每日最新资讯28at.com

Intellij 平台提供了允许一个插件与其他插件或者 IDE 交互的 extensions 以及 extension points 的概念。OiQ28资讯网——每日最新资讯28at.com

  • Extension Points:如果你想要你的插件可以被其他插件使用,那么你必须在你的插件内声明一个或多个扩展点(extension points)。每个扩展点定义了允许访问这个点的类或者接口。
  • Extensions:如果你想要你的插件扩展其他插件或者 Intellij 平台,你必须声明一个或多个 extensions。

可以在 plugin.xml 中的和块中定义 extensions 以及 extension points。OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com


OiQ28资讯网——每日最新资讯28at.com

plugin.xmlOiQ28资讯网——每日最新资讯28at.com

<!--依赖插件包--!><depends>Git4Idea</depends><!—idea第一次打开, 实际上就是订阅了应用程序打开的事件--><application-components><component><implementation-class>com.demo.intellij.plugin.vcr.push.VcrPushExtension$Proxy</implementation-class></component></application-components>

上述我们看到依赖的Git4Idea 包,如果我们想修改原生的的Git,先看下push依赖包中如何实现的。OiQ28资讯网——每日最新资讯28at.com

Git4Idea(plugin.xml)OiQ28资讯网——每日最新资讯28at.com

<extensions defaultExtensionNs="com.intellij"><pushSupport implementation="git4idea.push.GitPushSupport"/>...</extensions>

intellij-dvcs.jar(plugin.xml)OiQ28资讯网——每日最新资讯28at.com

<extensionPoints>  <extensionPoint name="pushSupport"                  interface="com.intellij.dvcs.push.PushSupport"                  area="IDEA_PROJECT"                  dynamic="true"/>....</extensionPoints>

从上述可看到,Git4Idea 的GitPushSupport扩展实现push的功能点,接下来我们主要对GitPushSupport进行javassist字节码修改以达到扩展git push组件能力。OiQ28资讯网——每日最新资讯28at.com

扩展使用GitPushSupport之前,需要将需要的类进行装载至GitPlugin中,然后再对GitPushSupport进行字节码改造,至此对git Push原生插件页进行改造。OiQ28资讯网——每日最新资讯28at.com


OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

步骤5:使用树状列表模式,展示一次push请求VCR提交内容及多个CR情况OiQ28资讯网——每日最新资讯28at.com

主要是实现JTreeTable,对VCR与CR进行管理。OiQ28资讯网——每日最新资讯28at.com

一次评审请求VCR包含所有CR的提交变更记录,可针对该变更记录进行代码评审,单个CR也可以进行评审。OiQ28资讯网——每日最新资讯28at.com


OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com


OiQ28资讯网——每日最新资讯28at.com

步骤6:展示变更文件视图及定制评论展示模块,精准定位代码OiQ28资讯网——每日最新资讯28at.com

代码评审主要根据编辑器获取代码行及位置,评论可精准定位到代码行。OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

1)changeBrowser变更视图展示VCR变更文件信息OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

2)双击文件,diff视图展示inline和side-by-side两种代码差异OiQ28资讯网——每日最新资讯28at.com

声明扩展,针对扩展类进行定制化改造。OiQ28资讯网——每日最新资讯28at.com

plugin.xmlOiQ28资讯网——每日最新资讯28at.com

<diff.DiffTool implementatinotallow="com.demo.intellij.plugin.vcr.ui.diff.VcrCommentsDiffTool$Proxy"/>


OiQ28资讯网——每日最新资讯28at.com

图片OiQ28资讯网——每日最新资讯28at.com

3)添加代码块评论,定位代码块OiQ28资讯网——每日最新资讯28at.com

AddCommentAction.javaOiQ28资讯网——每日最新资讯28at.com

public class AddCommentAction extends AnAction implements DumbAware {public AddCommentAction(String label,                        Icon icon,                        CommentsDiffTool commentsDiffTool,                                         Editor editor,                         List<CommentInfo> fileComments                        ....                        ) {    super(label, null, icon);}private CommentInput createComment() {//获取用户选择代码位置位置//行的情况下,默认是开头和行结束  得到光标的位置caretModel.getOffset();/*取到插字光标模式对象 CaretModel caretModel = editor.getCaretModel();得到光标的位置int caretOffset = caretModel.getOffset();//得到一行开始和结束的地方int lineNum = document.getLineNumber(caretOffset);int lineStartOffset = document.getLineStartOffset(lineNum);int lineEndOffset = document.getLineEndOffset(lineNum);获取一行内容String lineContent = document.getText(new TextRange(lineStartOffset, lineEndOffset));*/Document document = editor.getDocument();int lineNum  = document.getLineNumber(editor.getCaretModel().getOffset()) ;int lineStartOffset = document.getLineStartOffset(lineNum);int lineEndOffset = document.getLineEndOffset(lineNum);String lineContent = document.getText(new TextRange(lineStartOffset, lineEndOffset));.....}}

所有评论展示列表如何精准定位代码OiQ28资讯网——每日最新资讯28at.com

SafeHtmlHistoryComments.javaOiQ28资讯网——每日最新资讯28at.com

public class SafeHtmlHistoryComments extends JPanel {    private Iterable<CommentInfo> fileComments;    private List<CommentInfo> commentInfos = new ArrayList<>();    private CommentInfo currentCommentInfo;    private SelectedComment selectedComment;    private SelectedComment operatorSelectedComment;    private Editor editor;    public SafeHtmlHistoryComments(Editor editor,Iterable<CommentInfo> fileComments, Comment selectedComment) {        super(new BorderLayout());        ....      HistoryCommentListPanel historyCommentListPanel = new HistoryCommentListPanel(fileComments);               //双击table某行触发代码定位        historyCommentListPanel.addTableMouseDoubleHit(new Consumer<CommentInfo>() {            @Override            public void consume(CommentInfo commentInfo) {                 codeTextHit(editor,commentInfo);            }        });    }    /**     * 定位代码     * @param editor     * @param commentInfo     */    private static void codeTextHit(Editor editor, CommentInfo commentInfo) {        SelectionModel selectionModel = editor.getSelectionModel();        // 优化:如果文件修改过了,则不进行选中操作,换为提示        if (null != commentInfo.startIndex && null != commentInfo.endIndex && commentInfo.startIndex != 0 && commentInfo.endIndex != 0) {            editor.getCaretModel().moveToOffset(commentInfo.endIndex);            selectionModel.setSelection(commentInfo.startIndex, commentInfo.endIndex);        } else if (null != commentInfo.line && commentInfo.line != 0) {            int lineNum = commentInfo.line - 1;            editor.getCaretModel().moveToOffset(lineNum);            CharSequence charsSequence = editor.getMarkupModel().getDocument().getCharsSequence();            if(null!=commentInfo.range) {                RangeUtils.Offset offset = RangeUtils.rangeToTextOffset(charsSequence, commentInfo.range);                selectionModel.setSelection(offset.start, offset.end);            }else{                Document document = editor.getDocument();                int lineStartOffset = document.getLineStartOffset(lineNum);                int lineEndOffset = document.getLineEndOffset(lineNum);                selectionModel.setSelection(lineStartOffset, lineEndOffset);            }        }        editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);    }....}

六、未来展望

6.1 自动化代码评审

  1. 代码提交评审或代码合并之前,先自动化检查(Sonar/安全扫描)快速发现并纠正潜在问题,检查成功后提交评审。
  2. 代码评审通过之后,结合流水线,自定义部署构建策略,实现快速迭代。
  3. 自动汇聚测试报告,根据评审问题类型进行分类,不断改进Sonar检查规则,从而形成良性循环。

6.2智能化代码评审

  1. 提交代码评审之后,通过AI大模型对代码进行综合评价,并给出建议。
  2. 通过智能代码评审,产生评审报告,并进行智能化分析。

本文链接:http://www.28at.com/showinfo-26-96989-0.htmlvivo 互联网自研代码评审 VCR 落地实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React Query 的 useQuery 竟也内置了分页查询支持!

下一篇: 掉了两根头发后,我悟了!Vue3的Scoped原来是这样避免样式污染

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top