我总是遵循的一条规则是:如果变量编码某些特定单位的值,那么这些单位必须是变量名称的一部分.例:
int postalCodeDistanceMiles; decimal reactorCoreTemperatureKelvin; decimal altitudeMsl; int userExperienceWongBakerPainScale
我不会对崩溃任何火星登陆器(或我无聊的CRUD业务应用程序中的等效故障)负责.
function startEditing(){ if (user.canEdit(currentDocument)){ editorControl.setEditMode(true); setButtonDown(btnStartEditing); } }
应该像叙事作品一样阅读.
我总是遵循的一条规则是:如果变量编码某些特定单位的值,那么这些单位必须是变量名称的一部分.例:
int postalCodeDistanceMiles; decimal reactorCoreTemperatureKelvin; decimal altitudeMsl; int userExperienceWongBakerPainScale
我不会对崩溃任何火星登陆器(或我无聊的CRUD业务应用程序中的等效故障)负责.
这一切都取决于你正在开发的语言.因为我目前正在使用C#,所以我倾向于使用以下内容.
camelCase变量.
camelCase参数.
PascalCase的属性.
m_PascalCase用于成员变量.
单字母变量允许哪些地方? 我倾向于在for循环中这样做,但每当我这样做时感到有点内疚.但是对于循环的foreach和lambda表达式现在并不常见.
你在名字中放了多少信息?
如果代码有点难以理解写评论.不要将变量名称变成注释,即.
int theTotalAccountValueIsStoredHere
不需要.
你首选的无意义的变量名称是什么? (在foo和bar之后) i或x.foo和bar对我来说有点太大学教科书的例子了.
为什么他们拼写"foo"和"bar"而不是FUBAR? 传统
这些都是C#约定.
变名称外壳
案例表明范围.Pascal-cased变量是拥有类的字段.基于Camel的变量是当前方法的本地变量.
我只有一个前缀字符约定.类属性的支持字段是Pascal-cased并带有下划线的前缀:
private int _Foo; public int Foo { get { return _Foo; } set { _Foo = value; } }
我已经看到了一些C#变量命名约定 - 我很确定它是一个Microsoft文档 - 它反对使用下划线前缀.这对我来说似乎很疯狂.如果我查看我的代码并看到类似的东西
_Foo = GetResult();
我问自己的第一件事是,"我有充分的理由不使用属性访问器来更新该字段吗?" 答案通常是"是的,在开始使用此代码进行修补之前,您最好知道这是什么."
单字母(和短)变量名称
虽然我倾向于同意变量名称应该有意义的格言,但实际上在很多情况下使其名称有意义不会增加代码的可读性或可维护性.
循环迭代器和数组索引是使用短变量名和任意变量名的明显位置.在我的书中不那么明显,但同样适合的是nonce用法,例如:
XmlWriterSettings xws = new XmlWriterSettings(); xws.Indent = true; XmlWriter xw = XmlWriter.Create(outputStream, xws);
这是来自C#2.0代码; 如果我今天写的,当然,我不需要nonce变量:
XmlWriter xw = XmlWriter.Create( outputStream, new XmlWriterSettings() { Indent=true; });
但是在C#代码中仍有很多地方我必须创建一个对象,你只需要将其传递到其他地方然后扔掉.
许多开发人员会xwsTemp
在这种情况下使用名称.我发现Temp
后缀是多余的.我xws
在其声明中命名变量的事实(我只在该声明的可视范围内使用它;这很重要)告诉我它是一个临时变量.
我将使用短变量名称的另一个地方是一个大量使用单个对象的方法.这是一段生产代码:
internal void WriteXml(XmlWriter xw) { if (!Active) { return; } xw.WriteStartElement(Row.Table.TableName); xw.WriteAttributeString("ID", Row["ID"].ToString()); xw.WriteAttributeString("RowState", Row.RowState.ToString()); for (int i = 0; i < ColumnManagers.Length; i++) { ColumnManagers[i].Value = Row.ItemArray[i]; xw.WriteElementString(ColumnManagers[i].ColumnName, ColumnManagers[i].ToXmlString()); } ...
如果我给XmlWriter一个更长的名字,世界上没有办法让代码更容易阅读(或更安全的修改).
哦,我怎么知道这xw
不是一个临时变量?因为我无法看到它的声明.我只在其声明的4或5行内使用临时变量.如果我需要一个代码而不是那个代码,我要么给它一个有意义的名称,要么将代码重构为一个方法 - 嘿,多么巧合 - 将短变量作为参数.
你在名字中放了多少信息?
足够.
结果证明这是一种黑色艺术.我没有必要提供大量信息.我知道变量是属性访问器的后备字段,或临时的,或当前方法的参数,因为我的命名约定告诉我.所以我的名字没有.
这就是为什么它不那么重要.
在实践中,我不需要花费太多精力来计算变量名称.我把所有的认知努力都放在了命名类型,属性和方法上.这比命名变量要大得多,因为这些名称在范围内通常是公共的(或者至少在整个命名空间中是可见的).命名空间中的名称需要以相同的方式传达意义.
这段代码中只有一个变量:
RowManager r = (RowManager)sender; // if the settings allow adding a new row, add one if the context row // is the last sibling, and it is now active. if (Settings.AllowAdds && r.IsLastSibling && r.Active) { r.ParentRowManager.AddNewChildRow(r.RecordTypeRow, false); }
属性名称几乎使注释多余.(差不多.实际上有一个原因是为什么要调用属性AllowAdds
而不是AllowAddingNewRows
很多想法,但它不适用于这段特殊的代码,这就是为什么有一个注释.)变量名称?谁在乎?