你们先来试着理解一下这段代码:git
var todoList = new TodoList(); todoList.Todos = new List<Todo>(); var todo = new Todo() { Id = 0, Finished = false, Content = "测试" }; todoList.Todos.Add(todo) todo.Finished = true;
代码自己很简单,就算不用去看 TodoList 类和 Todo 类的定义,也是能够读懂以上代码的。github
那这是如何作到的呢?数组
答案就是:进行合适的命名。框架
而达到以上代码的效果的主要是变量的命名。编辑器
由于以上出现的类都是 Model 类,而 Model 则是用来描述业务是什么,而 Model 类中大部分代码则是变量。
好比 这是一个 TodoList App (待办事项),其中:工具
以上几点通常是咱们接收到任务并理解业务以后梳理出来的。若是设计成代码结构,结构大体以下:测试
很天然 Model 的代码就写出来了,代码以下。编码
TodoList.cs插件
public class TodoList { public List<Todo> Todos; }
Todo.csdebug
public class Todo { public int Id; public bool Finished; public string Content; }
为了让以上类更容易地在其余文件中理解,笔者在命名上作了哪些工做呢?
简单几行代码,就能够传达这么多信息,因此 命名是一门艺术。
在对一个变量进行命名的时候,无非要思考如下三点:
权限和类型的表达很容易,由于关于这方面的方法论(套路)是固定的,能够很容易掌握的。
比较考验功底的是变量的描述,是须要长期进行训练的。
接下来以这三点为主,分别进行方法论的介绍。
先从最简单的来,最简单的则是 权限 的表达
权限指的是访问权限,在 C# 中有 public、private、protected、internal 类型。
这里在进行变量命名时分为两种。
权限的表达,笔者本身的习惯是,可被外部访问的变量采用首字母大写。
好比:
public string Name; internal static int ReferenceCount;
而不可被外部访问的变量采用 m 前缀。
好比:
private string mShowedText; protected int mMgrId;
这是笔者长期的一个习惯,也是笔者本身维护的 QFramework 的命名规范。
因此关于权限的表达很是简单,依靠代码规范就能搞定了,规范怎么定就怎么用。
这一点是最最最容易达到的。
若是各位尚未开始在乎命名这件事情,从权限开始上手是最容易的。
变量是有类型的,最好呢是把类型可以表达出来。
类型的表达,固然这也能够依照某些代码规范来解决的。
好比匈牙利式的代码规范:
private int m_nAge; // n 表明数量 private string m_strName // str 表明 string
不过这种规范须要适应一段时间,这里笔者不太推荐新手用这种规范解决类型表达问题。
而是采用一种比较简洁、优雅的方式,来表达变量的类型。
好比:
public int Age;
Age 年龄,很容易想到是 int 类型。
public string Name;
Name 名字很容易想到是 string 类型。
public int PetCount; public int PetNumber;
宠物数量,很容易想到是 int 类型。
public bool Completed;
Completed 完成了,是 bool 类型。
而这部分的详细内容会在接下来的一个小节中详细介绍。
关于变量的描述的内容就比较多了,可是原则很简单,就两个字:准确。
为变量命名时最重要的考虑事项是,该名字要彻底、准确地描述出该变量所表明的事物。——《代码大全》
如何达到准确呢?这部分也会在接下来的一个小节中介绍。
在本小节,先给你们对变量所用的词类型进行简单的分类:
因此在以后详细讲述变量的描述表达部分会根据这三点来进行介绍。
读者读到这里,权限的表达是最容易作到的,若是没有意识到的童鞋们,能够在工做中开始权限的表达训练了。
权限的表达比较适合做为变量名训练的的第一步。
关于权限部分的内容就到此完结了,下文中再也不赘述。
而剩下的类型和描述用两个大章节进行详细介绍。
咱们先搞定相对较容易的类型的表达,这样好让你们掌握并快速在工做中实践。
List、Array 可使用名词的复数来搞定。
好比:
var todos = new List<Todo>(); var todos = new Todo[]{};
也能够将集合类型做为后缀表达
var todoList = new List<Todo>(); var todoArray = new List<Todo>();
Dictionary
由于是 key-value 类型的集合,可使用 xxx4yyy方式命名(4 = for),这是笔者我的习惯,不强制。
var todo4Id = new Dictionary<string,Todo>();
也可使用类型做为后缀。
var todoDict = new Dictionary<string,Todo>();
可是 key-value 类型使用 类型做为后缀表达效果较差,因此推荐 xxx4yyy 方式。
其余的集合类型,好比 Queue、Stack 等,也一样能够采用类型后缀的方式。
var panelStack = new Stack<UIPanel>(); var msgQueue = new Queue<Msg>();
Stack 和 Queue 是技术概念,因此通常会在框架/插件/工具层使用,在业务层使用得较少。
集合类型部分介绍到这里。
int 类型常见的后缀词(限定词):
Number
var todoNumber = todos.Length;
Index
var todoIndex = todos.IndexOf(todo);
Count
var todoCount = todos.Count;
int 类型常见的前缀词:
num
var numTodos = todos.Length; // number of todos 缩写,不太经常使用。
float/double 类型常见的后缀词
Average、Sum 等。
var ageAverage = ageSum / peopleCount;
这种类型的后缀词和前缀词在计算时常常会用到。
这里叫作计算限定词。
下面列出经常使用的计算限定词:
Count、Number、Num、Index、Total、Sum、Average、Max、Min、Record 等。
《代码大全》建议,除了 Num 以外其余的都建议放到后缀
还有一些数值类型的名字自己就表达了其类型。
age(int)、times(int) 等。
数据类型没什么好说的,只能尽可能选取名字自己就表达其类型的这种名字,而这部分的内容算是描述的表达部分,这里先列出一部分:
username(string)、password(string)、name(string)、content(string)、title(string)、description(string)、id(int/string) 等。
给 bool 类型取名的原则很简单,只要表示其状态只有两种就好。
好比 GameObject 要么为 激活状态 (active 为 true) ,要么为 未激活状态 (active 为 false)。符合这样的就是一个很好的 bool 变量名,不可能有第三个状态的。
再好比,一个任务要么完成(finished 为 true),要么为未完成(finished 为 false)。
枚举部分要分两个部分讲,一个是定义部分,一个是变量部分。
枚举的定义:
// 事件 public enum UIMainPanelEvent { // 事件监听 OnModelDataChanged, // 指令 (动宾短语、动词) UpdateView } // 状态 (与 bool 类型同样) public enum ResLoadState { LoadBegan, Loading, LoadEnded, } // 结果 (名词、形容词) public enum ResLoadResult { Success, Fail, }
定义部分和 bool 类型很像,好比 ModelDataChanged 就是 动词 + 时态的方式。
GameObject heroObj; GameObject heroGameObj; Transform heroTrans; Button btnEnterMainPanel; Image logoImage;
以上为常见的前缀、和后缀。
关于类型的表达介绍就到这里。
到这里咱们对类型的表达进行了详尽的介绍。
笔者关于类型表达的方法论也都所有介绍完了,你们能够笔者的方法论为准进行练习,在此基础上进行不断思考改进称为本身的方法论。
思考什么呢?
思考如何让别人(或本身)在别的文件中使用变量就能猜到其类型呢?
因此笔者介绍的方法论不是重点也不是权威,重点是不断进行思考。
终于到了重头戏了。
描述的表达是可以考验一个开发者功底的工做。
对于 Model 类的变量命名。
就像本 Chat 的开头的入门那样:
以上对各位的要求会比较高,因此笔者这里建议,你们熟练掌握了了权限和类型的表达后在进行描述的练习。
而在这以前,本 Chat 也只是介绍了 Model 的变量命名。
这是由于 Model 的变量定义是相对容易的。可是咱们的工做不仅有定义 Model,还有好多其余的类须要咱们定义,而定义类多少要定义一些变量。而本 Chat 不能覆盖全部的变量命名场景,因此会给出一些准则和练习步骤来给你们参考。
在 Unity 中少数的须要显示在编辑器上提供参数调整的变量能够用一些中文汉字。而剩余的最好是所有使用英文。
这里最好是在编码时随手备着一个查词软件,能够经过键盘快捷键快速查询的。要养成这个习惯。到最好发现,在某一个领域或某种业务经常使用的词汇就那些,本身都记住了,不多会再编码时使用查词软件。
这个标题是笔者本身理解的,《代码大全》的描述是变量名应该描述的是 what 而不是 how。也就是变量是什么而不是怎么作。
由于业务概念是现实的模拟,而技术概念只是手段。因此笔者理解为为了业务命名而不是为技术命名。
要理解此准则很是简单。摘抄《代码大全》的一段话给你们理解:
一个好记的名字反映的一般都是问题,而不是解决方案。一个好名字一般表达的是“什么”(what),而不是“如何”(how)。通常而言,若是一个名字反映了计算的某些方面而不是问题自己,那么它反映的就是“how”而非“what”了。请避免选取这样的名字,而应该在名字中反映出问题自己。
一条员工数据记录能够称做 inputRecord 或者 employeeData。inputRecord 是一个反映输入、记录这些计算概念的计算机术语。employeeData 则指的是问题领域,与计算世界无关。与此相似,对一个用于表示打印状态的位域来讲,bitFlag 就要比 printerReady 更具计算机特征。在财务软件里,calculateValue 的计算痕迹(how) 也要比 sum (what) 明显。
书中原文解释的很清楚了,再也不多说了。
这里要说一点注意的,要分清楚在哪一个层。举一个笔者框架中的 SerializeHelper (序列化器),序列化是技术概念,是“怎么作?” (how),可是它能够作游戏数据的存储等操做。那么它为何不叫作 DataSaver/DataLoader 这些名字呢?
这是由于 SerializeHelper 这个类不在业务层,而是在框架层。框架自己提供的更多的是工具。
练习步骤给出了 一、二、3,很容易上手,命名这件事自己比较容易掌握,可贵是初学者很是不在乎。老手呢通常趟坑躺多了天然就会意识到。而初学者再去趟一下这些坑有点浪费时间,不如一开始就意识到命名这件事的重要性。
到此呢,权限、类型、描述的练习步骤和原则(准则)都给了。接下来简单聊聊,为何要命名和如何更容易地落实命名这件事到工做中呢?
代码的本质是信息,其承载着信息,这个信息能够被编译器理解,也要被人理解。
首先你,代码要被编译器理解,这是最基本的要求,也表明着开发者能和计算机沟通,让计算机帮忙处理任务。
其次呢,是要被人理解。
这些人多是:
最终受益最多的仍是本身,而投入的只不过每一个变量多花费了几秒的思考时间而已。
总之协做这个词有一个协字,能够理解成妥协的协,也能够理解成协助的协。
给变量合适的命名既是一种妥协也是一种协助。
这就是为何笔者单开一个 chat 来写一个你们认为如此简单的事情。
单写这一小节是但愿你们不是只读一读这篇 chat 就完事了,而是要把变量的命名这件事情落实到本身产出的代码上去。
在工做中养成一个习惯的阻碍有不少。
最多见的缘由就是项目时间紧。
这个问题很好解决,只要训练的时机根据实际状况进行调整就行了。
对于初学者或者项目很是紧急的开发者,在第一遍写逻辑的时候,变量能够先随便命名(按照本身的习惯),可是只要当前的测试点验证经过或者功能点完成,就应该回过头把变量的名字好好想下,进行从新命名。通常 IDE 都带重构功能,只要改一个地方,其余代码部分会所有跟着更改。
这样作的目的是为了防止同一时间作两件事情。
对于命名新手来讲,同一时间作两件事情会很吃力。
自己逻辑编写就很吃力了,再加上须要思考的变量命名,会更加吃力。
因此对于命名新手要求同一时间只思考一件事情。
对于时间很是紧急的开发者,若是进行命名的思考会影响项目的进度,那仍是等项目不急的时候再落实就行了。
只要能作到,在进行逻辑编写时,只考虑如何完成或者如何实现就行了。
在变量命名时,只专一于如何取个合适的名字,只考虑变量的描述、类型、权限就好。
以下:
这样坚持一段时间后,就能作到同一时间就能够作两件事情。
初学者们只要记住一点就够了:
可是最终目标仍是将进行合适的命名这件事情养成习惯,在建立变量的同时就已经为变量取了一个很是合适的名字。
最后,很是感谢 QFramework 的 边上海 边前辈对此专栏的勘误和提供的一些很是有价值的建议。
QFramework 地址:https://github.com/liangxiegame/QFramework
QQ 交流群:623597263
Unity 进阶小班:
关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。