【Unity】 使用代码分析(Roslyn Analyzers)实现自动代码审查(Code Review)

索引

  • Roslyn Analyzers
  • Code Review
    • 自动 Code Review 案例
      • 1.public、internal权限的字段建议以大写字母开头。
      • 2.private、protected权限的字段建议以下划线+小写字母开头。
      • 3.不建议直接继承 MonoBehaviour,建议继承至 HTBehaviour。
      • 4.不建议使用 Input 判断输入或获取鼠标位置,建议使用 Main.m_Input 替代。
      • 5.不建议在 Update、FixedUpdate、OnUpdateFrame 等帧执行方法中调用 GetComponent 方法,建议将组件缓存。
      • 6.多个字符串串联(3个或以上)建议使用【$语法】或【string.Format】或【StringBuilder】替代。
      • 7.float类型不建议使用 == 判断相等,建议使用 Mathf.Approximately 判断约等。
      • 8.类必须添加XML文档注释。
      • 9.public、internal权限的方法必须添加XML文档注释。
    • 反馈至Unity编辑器
  • 实现步骤
    • 开发环境
    • 一、新建VS工程
    • 二、管理NuGet程序包
    • 三、安装Microsoft.CodeAnalysis.CSharp包
    • 四、编写分析器程序
      • 1.新建类DiagnosticAnalyzer01
      • 2.实现抽象方法
      • 3.编写分析器代码
      • 4.生成解决方案
    • 五、使用分析器程序
      • 1.浏览dll
      • 2.拷贝dll
      • 3.设置dll
      • 4.新建一个脚本
    • 六、总结

Roslyn Analyzers

Roslyn Analyzers是.NET编译平台的代码分析程序,用以检查 C# 或 Visual Basic 代码的样式、质量、可维护性、设计及其他问题。

Code Review

虽然人工Code Review能检查出100%(取决于Reviewer的水平)的代码问题,但很多简单明了的设计或性能上的优化改进意见,我们依然想要它在程序员编码时便实时提醒出来,所以我们需要自动Code Review

自动 Code Review 案例

例如,目前我们的自动Code Review系统包含但不仅限于如下这些案例:

1.public、internal权限的字段建议以大写字母开头。

ID:D0001
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
在这里插入图片描述

2.private、protected权限的字段建议以下划线+小写字母开头。

ID:D0002
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
在这里插入图片描述

3.不建议直接继承 MonoBehaviour,建议继承至 HTBehaviour。

ID:D0007
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
在这里插入图片描述

4.不建议使用 Input 判断输入或获取鼠标位置,建议使用 Main.m_Input 替代。

ID:O0001
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
在这里插入图片描述

5.不建议在 Update、FixedUpdate、OnUpdateFrame 等帧执行方法中调用 GetComponent 方法,建议将组件缓存。

ID:O0002
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
在这里插入图片描述

6.多个字符串串联(3个或以上)建议使用【$语法】或【string.Format】或【StringBuilder】替代。

ID:O0003
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
在这里插入图片描述

7.float类型不建议使用 == 判断相等,建议使用 Mathf.Approximately 判断约等。

ID:O0004
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
在这里插入图片描述

8.类必须添加XML文档注释。

ID:F0001
类型:Force(强制规范)
级别:错误(编译级错误,影响程序执行)
在这里插入图片描述

9.public、internal权限的方法必须添加XML文档注释。

ID:F0002
类型:Force(强制规范)
级别:错误(编译级错误,影响程序执行)
在这里插入图片描述

反馈至Unity编辑器

自动Code Review会以其对应的级别(警告还是错误)同步反馈至Unity编辑器的Console窗口,如果是错误级别,则编辑器将无法播放,必须解决掉该优化改进意见。
在这里插入图片描述

实现步骤

开发环境

  • Visual Studio 2022(社区版)
  • Unity 2022.3.17

一、新建VS工程

新建一个VS工程,模板为类库(且为面向.NET Standard,以兼容Unity),工程名称为CodeReview
在这里插入图片描述

二、管理NuGet程序包

鼠标右击解决方案,选择管理NuGet程序包
在这里插入图片描述

三、安装Microsoft.CodeAnalysis.CSharp包

搜索并安装Microsoft.CodeAnalysis.CSharp包,3.8.0版本(Unity官方文档要求为该版本)
在这里插入图片描述

四、编写分析器程序

1.新建类DiagnosticAnalyzer01

新建类DiagnosticAnalyzer01,继承至DiagnosticAnalyzer

namespace CodeReview
{public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{}
}

2.实现抽象方法

实现该类的抽象方法:(该类将用于实现一个检测类名不能过短的分析器)

namespace CodeReview
{/// <summary>/// T001:类名定义不能过短。/// </summary>[DiagnosticAnalyzer(LanguageNames.CSharp)]public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => throw new NotImplementedException();public override void Initialize(AnalysisContext context){context.EnableConcurrentExecution();context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);//注册类定义语法回调context.RegisterSyntaxNodeAction(OnSyntaxNodeAction, SyntaxKind.ClassDeclaration);}//当任意类定义语法编译时,将回调此方法private void OnSyntaxNodeAction(SyntaxNodeAnalysisContext context){}}
}

3.编写分析器代码

接下来就是在回调方法中编写分析器代码:

namespace CodeReview
{/// <summary>/// T001:类名定义不能过短。/// </summary>[DiagnosticAnalyzer(LanguageNames.CSharp)]public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{public DiagnosticDescriptor Rule{get{if (_descriptor == null){_descriptor = new DiagnosticDescriptor("T001","类名定义不能过短。","类名定义不能过短。","Test",DiagnosticSeverity.Error,true);}return _descriptor;}}public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);private DiagnosticDescriptor _descriptor;public override void Initialize(AnalysisContext context){context.EnableConcurrentExecution();context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);context.RegisterSyntaxNodeAction(OnSyntaxNodeAction, SyntaxKind.ClassDeclaration);}private void OnSyntaxNodeAction(SyntaxNodeAnalysisContext context){ClassDeclarationSyntax classDeclaration = (ClassDeclarationSyntax)context.Node;//发现类名过短if (classDeclaration.Identifier.ToString().Length <= 3){//上报分析器context.ReportDiagnostic(Diagnostic.Create(Rule, classDeclaration.Identifier.GetLocation()));}}}
}

4.生成解决方案

鼠标右击解决方案,选择生成
在这里插入图片描述
此时,我们的分析器:T001:类名定义不能过短就编写完成了。

五、使用分析器程序

1.浏览dll

鼠标右击解决方案,选择在文件资源管理器中打开文件夹
在这里插入图片描述

2.拷贝dll

进入bin/Debug/netstandard2.0目录,将CodeReview.dll拖拽到任意Unity编辑器中的任意Editor目录下:
在这里插入图片描述

3.设置dll

选中CodeReview.dll,设置为下图的导入设置:
在这里插入图片描述

4.新建一个脚本

此时就可以新建一个脚本进行测试了,我们新建脚本T1,如果不出意外,你将收获一个错误提示:
在这里插入图片描述

六、总结

如上,一个测试分析器程序便开发完成了,如果你能熟悉语法分析,我想你应该知道,在分析器程序中,你将无所不能。

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

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

相关文章

命令执行。

命令执行 在该项目的readme中&#xff0c;描述了怎么去调用的flink 通过java原生的runtime来调用flink&#xff0c;下一步就是去看看具体的调用过程了&#xff0c;是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…

C++-6

使用模板类&#xff0c;实现顺序栈。 #include <iostream>using namespace std; template <typename T> class Seqlite {T data[30];int len0; public:void head_inst(T date);void head_dele();void show(); }; template <typename T> …

Phi-3-mini-4k-instruct 的功能测试

Model card 介绍 Phi-3-Mini-4K-Instruct 是一个 3.8B 参数、轻量级、最先进的开放模型&#xff0c;使用 Phi-3 数据集进行训练&#xff0c;其中包括合成数据和经过过滤的公开可用网站数据&#xff0c;重点是 高品质和推理密集的属性。 该型号属于 Phi-3 系列&#xff0c;Mini…

Django框架之ORM操作

一、选择数据库 1、默认数据库 Django默认的数据库是sqlite3数据库 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }2、指定数据库 修改连接到MySQL数据库 DATABASES {default: {ENGINE: django.db.backends.mysql,# 数据库名…

一、安装Redis并运行

Windows安装Redis 1.打开网址下载 下载地址&#xff1a;https://github.com/tporadowski/redis/releases。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择 我选择的是 然后一步步安装 可以参考&#xff1a;https://blog.csdn.net/zbx931197485/article/d…

李廉洋:4.29黄金原油最新走势分析,做单必看策略,

传统定价框架下&#xff0c;黄金兼具货币、商品和金融三重属性&#xff0c;对应货币、抗通胀和避险价值&#xff0c;因此通常与美元、美债利率反向变动。但近期这一定价规律“失灵”了&#xff0c;黄金、利率和美元同涨。三者同涨后&#xff0c;一个月后续转为下跌的频率超过一…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象&#xff1a; var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

基于yolov5实时实例分割

是一个结合了最新技术进展&#xff08;State-of-the-Art, SOTA&#xff09;的实时实例分割项目&#xff0c;基于著名的YOLOv5目标检测架构&#xff0c;并对其进行扩展以实现对图像中每个对象实例的精确像素级分割。以下是该项目的中文介绍&#xff1a; YOLOv5&#xff1a; YOL…

Java后端利用百度地图全球逆地理编码,获取地址

声明&#xff1a;本人是在实习项目的时候遇到的问题 一.使用Api分为四步骤全球逆地理编码 rgc 反geo检索 | 百度地图API SDK 步骤1,2自行完成 接下来去获取AK 二.申请AK 登录百度账号 点击创建应用&#xff0c;选择自己想用的服务&#xff0c;我只单选了逆地理编码&#xff…

go语言实现简单认证样例

目录 1、代码实现样例 2、postman调用 1、代码实现样例 package mainimport ("net/http""strings""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var (// 密钥&#xff0c;用于验证 JWT 令牌signingKey []byte("…

【1762】java校园单车投放系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java校园单车投放管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…

C语言基础知识笔记——万字学习记录

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要参考浙大翁恺老师的C语言讲解以及其他博主的C语言学习笔记&#xff0c;进而梳理C语言的基础知识&#xff0c;为后续系统性学习数据结构和其他语言等知识夯实一定的基础。&#xff08;其他博主学习笔记的链接包括&#x…

网络服务SSH-远程访问及控制

一.SSH远程管理 1.SSH介绍 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;最早是由芬兰的一家公司开发出来&#xff0c;并且在IETF &#xff08;Internet Engineering Task Force&#xff09;的网络草案基础上制定而成的标准协议。主要用来实现字符…

案例-部门管理-删除

黑马程序员JavaWeb开发教程 文章目录 一、查看页面原型二、查看接口文档三、开发1、Controller2、Service&#xff08;1&#xff09;service接口层&#xff08;3&#xff09;service实现层 3、Mapper4、Postman 一、查看页面原型 二、查看接口文档 三、开发 1、Controller 因…

短视频账号“四部定位法”,让流量噌噌上涨 沈阳短视频剪辑培训

在当下短视频的风潮中&#xff0c;企业纷纷涉足这一领域&#xff0c;希望通过短视频平台吸引用户、提升品牌知名度、促进销售转化。 然而&#xff0c;面对海量的内容和激烈的竞争&#xff0c;企业如何才能在短视频领域脱颖而出&#xff1f; 在企业涉足短视频领域之前&#xf…

用友裁应届

下半年准备来用友的24应届生们&#xff0c;请三思&#xff01;&#xff01;&#xff01; 我是23届某9研究生&#xff0c;2月份用友以绩效低为由被裁&#xff08;我一个应届生跟老员工比绩效&#xff0c;搞笑呢&#xff09;。 半年被裁&#xff0c;找工作太难了&a…

# 使用 spring boot 时,@Autowired 注解 自动装配注入时,变量报红解决方法:

使用 spring boot 时&#xff0c;Autowired 注解 自动装配注入时&#xff0c;变量报红解决方法&#xff1a; 1、使用 Resource 代替 Autowired 注解&#xff0c;根据类型注入改为根据名称注入&#xff08;建议&#xff09;。 2、在 XXXMapper 上添加 Repository 注解&#xff0…

区块链技术:NFG元宇宙电商模式

大家好&#xff0c;我是微三云周丽 随着互联网技术的迅猛发展&#xff0c;电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中&#xff0c;元宇宙电商以其独特的商业模式和巨大的发展潜力&#xff0c;成为行业的新宠。其中&#xff0c;NFG作为元宇宙电商模式的代表&am…

单链表-java

此次我们主要通过数组来模拟一下单链表&#xff0c;并完成一些基本的功能。 文章目录 前言 一、单链表 二、思路模拟 1.引入变量解释 2.链表初始化 3.在头结点后插入一个结点 4.表示在第k个数后面插入一个数 5. 把第k个数后面的一个数删除掉 三、代码如下 1.代码如下&#xff1…