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

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

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

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

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

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

一、代码评审演进


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

plugin.xmlUx228资讯网——每日最新资讯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依赖包中如何实现的。Ux228资讯网——每日最新资讯28at.com

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

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

intellij-dvcs.jar(plugin.xml)Ux228资讯网——每日最新资讯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组件能力。Ux228资讯网——每日最新资讯28at.com

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


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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

AddCommentAction.javaUx228资讯网——每日最新资讯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));.....}}

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

SafeHtmlHistoryComments.javaUx228资讯网——每日最新资讯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. 通过智能代码评审,产生评审报告,并进行智能化分析。

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

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

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

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

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

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top
Baidu
map