string userName; Text userNameText; //错误(不用写明类型,如果这成了规范,会成为一种无意义的负担) Text userNameUI;//正确(不仅也避免了和userName重名,而且解释了其作用) Text _user_Name;//错误(同样是无意义的负担,而且看起来很不规整)
针对具体类型有一些专门的命名要求
类型
描述
示例
接口
对应类名添加I前缀。
IInterface
泛型
对应类型添加T前缀。
TGeneric
函数
表示动作,采用主动语态。
OpenDoor
事件
表示动作,采用被动语态。 触发在对应函数开头或期间使用进行时,触发在函数结束使用过去时。
DoorOpening、DoorOpened
事件函数(用于实现事件的函数)
表示动作,采用被动语态,在对应事件命名的基础上添加on前缀。
OnDoorOpening、OnDoorOpened
字段
名词和可选的形容词,采用被动语态。由于字段不允许公开,所以永远为小驼峰命名法。
isDoorOpening
属性
通常与字段对应,故与对应字段同名。且通常属性是公开类型,故一般会采用大写开头。
IsDoorOpening
针对具体功能也有些专门的命名要求(这些要求不分类型,字段名、类名等都要遵守):
功能
要求
静态单例对象
Instance
提供功能服务的类(MVP架构中的M)
+System
负责界面相关的类(对应MVP中的V)
+UI
负责驱动链接模块,推动游戏流程的类(对应MVP中的P)
+Controller
用于实例化的预制体
+Prefab
实现规范
使用优秀的代码设计策略,增加程序的可维护性。
功能性要求
这些要求会影响你的功能实现,但有助于不同功能间的开发协作。
非常量字段永远不允许公开,应使用属性代替。
1 2
publicint Value;//错误(字段操作无法监控,外部程序可以随意操控) publicint Value {get; privateset;};//正确(属性可以验证操作过程,避免错误行为)
//错误(显式写明修饰符较冗长且需要专门阅读修饰符的单词内容) privateintvalue; publicint Value {publicget;publicset;} //正确(非常简约,大幅减少代码量,且不需要专门阅读修饰符) intvalue; publicint Value {get;set;}
var a = GetValue(); //错误(必须通过二次查询才能获取类型信息,非常影响阅读效率) int a = GetValue(); //正确(一眼就可以看出类型信息,非常直观,清晰的类型名易于理解代码) List<int> b = new();//正确(最新的语法糖,保留类型信息同时简化代码,比var好)