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

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

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

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

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

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

一、代码评审演进


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

SafeHtmlHistoryComments.javadNV28资讯网——每日最新资讯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在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top