索引
- 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编辑器
- 实现步骤
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
,如果不出意外,你将收获一个错误提示:
六、总结
如上,一个测试分析器程序便开发完成了,如果你能熟悉语法分析,我想你应该知道,在分析器程序中,你将无所不能。