如何命名variables
- 你用什么规则来命名你的variables?
- 单字母变字在哪里?
- 你给这个名字写了多less信息?
- 例如代码呢?
- 你最喜欢什么毫无意义的variables名? (在foo&bar之后)
- 他们为什么拼写“foo”和“bar”而不是FUBAR
function startEditing(){ if (user.canEdit(currentDocument)){ editorControl.setEditMode(true); setButtonDown(btnStartEditing); } }
应该像叙事工作一样阅读。
我总是遵循的一个规则是:如果一个variables编码一些特定单位的值,那么这些单位必须是variables名称的一部分。 例:
int postalCodeDistanceMiles; decimal reactorCoreTemperatureKelvin; decimal altitudeMsl; int userExperienceWongBakerPainScale
我不会负责任何火星登陆器(或在我无聊的CRUD业务应用程序中的同等失败)。
那么这一切都取决于你正在开发的语言。因为我目前正在使用C#我倾向于使用以下。
camelCase的variables。
camelCase参数。
PascalCase属性。
m_PascalCase成员variables。
单字母变字在哪里? 我倾向于这样做的循环,但每当我这样做,感到有点内疚。 但用foreach和lambdaexpression式循环现在不是很普遍。
你给这个名字写了多less信息? 如果代码有点难以理解,请发表评论。 不要把variables名变成注释,即。 int theTotalAccountValueIsStoredHere
不是必需的。
你最喜欢什么毫无意义的variables名? (在foo&bar之后) i或x。 foo和bar对我来说有点太大学教科书范例了。
他们为什么拼写“foo”和“bar”而不是FUBAR? 传统
这些都是C#约定。
变名的shell
案例表明范围。 Pascalvariables是拥有类的字段。 驼峰variables是当前方法的本地variables。
我只有一个前缀字符约定。 类属性的后台字段为Pascal,并以下划线作为前缀:
private int _Foo; public int Foo { get { return _Foo; } set { _Foo = value; } }
有一些我见过的C#variables命名约定 – 我敢肯定,这是一个微软文档 – 反对使用下划线前缀。 这对我来说似乎很疯狂。 如果我看看我的代码,看到类似的东西
_Foo = GetResult();
我自问的第一件事就是,“我是否有充分的理由不使用财产访问者来更新这个领域呢? 答案往往是“是的,你最好知道这是什么,然后开始瞎猜这个代码。”
单字母(和短)variables名称
虽然我倾向于赞同variables名称应该是有意义的说法,但实际上在很多情况下,使得它们的名字有意义并没有增加代码的可读性或可维护性。
循环迭代器和数组索引是使用短variables名和任意variables名的显而易见的地方。 不太明显,但在我的书中不太恰当,是现成的用法,例如:
XmlWriterSettings xws = new XmlWriterSettings(); xws.Indent = true; XmlWriter xw = XmlWriter.Create(outputStream, xws);
这是从C#2.0代码; 如果我今天写了,当然,我不需要noncevariables:
XmlWriter xw = XmlWriter.Create( outputStream, new XmlWriterSettings() { Indent=true; });
但是,在C#代码中仍然有很多地方需要创build一个对象,而您只需要将其传递到其他地方,然后扔掉。
在这种情况下,很多开发者会使用像xwsTemp
这样的名字。 我发现Temp
后缀是多余的。 事实上,我在它的声明中命名variablesxws
(我只在该声明的可视范围内使用它;这很重要)告诉我,这是一个临时variables。
另一个地方,我将使用短variables名称在一个方法,使大量使用单个对象。 这是一个生产代码:
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
不是一个临时variables? 因为我看不到它的声明。 我只在其声明的4或5行内使用临时variables。 如果我需要一个更多的代码,我可以给它一个有意义的名字,或者将它重构成一个方法 – 嘿,这是一个巧合 – 将短variables作为参数。
你给这个名字写了多less信息?
足够。
这原来是一种黑色艺术。 有很多信息我不需要input名字。 我知道什么时候一个variables的属性访问器的后台字段,或者是临时的,或者是当前方法的一个参数,因为我的命名约定告诉我这一点。 所以我的名字没有。
这就是为什么这不重要。
在实践中,我不需要花费太多精力来计算variables名称。 我把所有的认知工作都放在命名types,属性和方法上。 这比命名variables要重要得多 ,因为这些名字经常在范围内公开(或者至less在整个名字空间中是可见的)。 命名空间中的名字需要以相同的方式传达意义。
这个代码块中只有一个variables:
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
,但是它并不适用于这个特殊的代码,这就是为什么有一个注释。)variables名? 谁在乎?
几乎每一种广泛使用的现代语言都有自己的编码标准。 这是一个很好的起点。 如果一切都失败了,只要使用推荐的。 当然也有例外,但是这些都是一般的指导方针。 如果你的团队喜欢某些变化,只要你同意他们,那也没问题。
但是在一天结束的时候,这不一定是你使用的标准,而是你有他们的事实,他们是坚持的。
- 我只使用单字符variables进行循环控制或使用非常短的函数。
for(int i = 0; i< endPoint; i++) {...} int max( int a, int b) { if (a > b) return a; return b; }
- 信息的数量取决于variables的范围,可以使用的地方越多,我想知道更多的信息来追踪它的目的。
- 当我编写示例代码时,我尝试按照真实代码的方式使用variables名称(尽pipe函数可能会得到像foo或bar这样的无用名称)。
- 请参阅“Foo”的词源
你用什么规则来命名你的variables?
通常,由于我是C#开发人员,因此我遵循由IDesign C#Coding Standard指定的variables命名约定,原因有两个
1)我喜欢它,并且很容易阅读。 2)这是我现在使用的广泛使用的Visual Studio 2005/2008的Code Style Enforcer AddIn的默认设置。
单字母变字在哪里?
有几个地方我会允许单字母variables。 通常这些是简单的循环索引器,或者像X,Y,Z坐标那样的math概念。 除此之外,从来没有! (到处都是我用过的,重读代码的时候我都被他们咬了)。
你给这个名字写了多less信息?
足以知道variables正被用于什么。 如罗伯特·马丁所说:
variables,函数或类的名称应该回答所有大问题。 它应该告诉你为什么存在,它做了什么,以及如何使用它。 如果一个名字需要评论,那么这个名字不会显示它的意图。 从清洁代码 – 敏捷软件工艺手册
我从不使用像foo或bar这样毫无意义的variables名,当然,除非代码真的被丢弃了。
对于循环variables,我将字母加倍,以便在文件中searchvariables更容易。 例如,
for (int ii=0; ii < array.length; ii++) { int element = array[ii]; printf("%d", element); }
你用什么规则来命名你的variables? 我在单词(load_vars),骆驼套(loadVars)和没有空格(loadvars)之间的下划线之间切换。 类始终是CamelCase,大写。
单字母变字在哪里? 大部分是循环的。 一次性代码中的临时variables。
你给这个名字写了多less信息? 足以提醒我编码时的情况。 (是的,以后可能会导致问题!)
你最喜欢什么毫无意义的variables名? (在foo&bar之后) temp,res,r。 我其实不使用foo,而是一个很好的数字。
你用什么规则来命名你的variables?
- 我需要在一年的时间内了解它。 还应该符合预先存在的风格。
单字母变字在哪里?
- 超显而易见的东西。 如char c; c = getc(); 循环指示(i,j,k)。
你给这个名字写了多less信息?
- 很多很多。
例如代码呢?
- 同上。
你最喜欢什么毫无意义的variables名? (在foo&bar之后)
- 我不喜欢有无意义的variables名称。 如果一个variables没有任何意义,为什么在我的代码?
他们为什么拼写“foo”和“bar”而不是FUBAR
- 传统。
我坚持的规则是;
名称是否完全准确地描述variables代表什么?
名称是指现实世界问题而不是编程语言解决scheme?
这个名字够长吗,你不必把它搞糊涂?
在名称末尾是否有计算值限定符?
他们是否只在需要的时候特别实例化?
你用什么规则来命名你的variables? 所有重要variables的驼峰,所有类的驼峰
单字母变字在哪里? 在循环结构和math函数中,单字母var名称与math定义一致。
你给这个名字写了多less信息? 你应该能够像书一样阅读代码。 函数名称应该告诉你函数做了什么(scalarProd(),addCustomer()等)
例如代码如何?
你最喜欢什么毫无意义的variables名? (foo&bar之后) temp,tmp,input,我从来没有真正用过foo和bar。
我想说尽可能清楚地命名它们。 切勿使用单个字母variables,只使用“foo”和“bar”(如果只是testing某些内容(例如,以交互模式)并且不会在生产中使用它)。
我喜欢在我的variables前面加上前缀:str = String,int = Integer,bool = Boolean等
使用单个字母在循环中快速简单:对于i = 0到4 …循环
variables被做成一个简短但描述性的替代你正在使用的东西。 如果variables太短,你可能不知道它是什么。 如果太长,你将永远打一个代表5的variables。
例如代码使用Foo&Bar来显示代码的工作方式。 您可以使用任何不同的无意义字符来代替。 我通常只使用i,x,&y。
我个人对foo酒吧和fu酒吧的看法是,这太明显了,没有人喜欢2字符variables,3更好!
在DSL和其他stream利的接口中,variables名和方法名通常构成一个词汇实体。 例如,我个人喜欢将动词放在variables名称(而不是方法名称)中的(公认的异端)命名模式。 参见第六条variables命名规则
另外,我喜欢使用$
作为一个代码片段的主variables的variables名称。 例如,一个可以打印树结构的类可以使用$
作为StringBuffer的instvariables。 @see 这是详细的!
否则,我会参考Einar Hoest编程人员的短语手册。 @see http://www.nr.no/~einarwh/phrasebook/
我总是在for循环中使用单个字母variables,它只是更好看,更容易阅读。
这很大程度上取决于你正在编程的语言,在C ++中我没有像在Java中那样将variables命名为相同的名称(Java使得它本身对于过长的variables名称imo更好,但这可能只是个人偏好。或者,它可能与Java内置命名如何命名有关…)。
当地人:fooBar; 成员/types/函数FooBar接口:IFooBar
至于我,只有名字是经典的,单个字母才是有效的。 i / j / k仅用于本地循环索引,x,y,z表示vector部分。
变种的名字传达的意义,但足够短,不包装线
foo,bar, baz 。 泡菜也是最喜欢的。
我学会了不要在VB3中使用单字母variables名称。 问题是,如果你想在任何地方search一个variables,使用单个字母很难。
新版本的Visual Studio具有智能variablessearchfunction,可以避免这个问题,但是老习惯等等。 无论如何,我更喜欢在荒谬的一面犯错。
for (int firstStageRocketEngineIndex = 0; firstStageRocketEngineIndex < firstStageRocketEngines.Length; firstStageRocketEngineIndex++) { firstStageRocketEngines[firstStageRocketEngineIndex].Ignite(); Thread.Sleep(100); // Don't start them all at once. That would be bad. }
如何命名variables几乎是不重要的。 除了由语言指定的规则之外,您确实不需要任何规则,或者至less需要由编译器执行的规则。
select你认为你的队友所能想到的名字被认为是有礼貌的,但是风格规则并没有像人们想象的那样真正起作用。
由于我作为承包商工作,在不同的公司和项目之间移动,我更喜欢避免自定义命名约定。 这使得新开发人员或维护开发人员更难以熟悉(并遵循)正在使用的标准。
所以,虽然人们可以在其中find不同意的观点,但我期待着官方的微软networking(Microsoft Net)的指导方针,以获得一致的命名约定。
除了一些例外(匈牙利符号),我认为一致的使用可能比任何一套任意的规则更有用。 也就是说,每次都这样做。
。
更新
首先,命名取决于现有的惯例,无论是从语言,框架,图书馆还是项目。 (当在罗马…)例如:使用jQuery风格的jQuery插件,使用苹果风格的iOS应用程序。 前面的例子需要更多的警惕(因为JavaScript会变得混乱,不会自动检查),而后面的例子更简单,因为这个标准已经被很好的执行和遵循了。 YMMV取决于领导者,社区,尤其是工具。
我将把我所有的命名习惯放在一边,遵循现有的惯例。
一般来说,我遵循这些原则,所有以编程为中心的原则都是通过书面语言的另一种人际沟通forms。
-
可读性 – 重要的部分应该有固定的名字; 但是这些名字不能代替正确的意图文件。 代码可读性的testing是,如果你可以在几个月后回来,仍然有足够的理解,不要在第一印象时抛弃整个事情。 这意味着避免缩写; 看匈牙利符号的情况 。
-
可写性 – 公共区域和样板应该保持简单(尤其是如果没有IDE),所以编写代码更容易,更有趣。 这是Rob Robke风格的启发。
-
可维护性 – 如果我像
arrItems
那样将types添加到我的名字中,那么如果我将该属性更改为扩展Array
的CustomSet
类的实例,就会arrItems
。 types注释应该保存在文档中,并且只在适当的情况下(对于API等)。 -
标准通用命名 – 对于愚蠢的环境(文本编辑器):类应该在
ProperCase
,variables应该是短的,如果需要的话可以在snake_case
,函数应该在camelCase
。
对于JavaScript,这是一个经典的语言限制和影响命名的工具。 它有助于通过不同的命名区分variables和函数,因为没有IDE来握住你的手,而this
prototype
和其他样板掩盖了你的视野,并混淆了你的分化技能。 在一个范围内看到所有不重要的或全球派生的variables都是缩写。 该语言没有import [path] as [alias];
,所以本地瓦尔变成别名。 然后是一系列不同的空格式约定。 这里唯一的解决scheme(以及任何地方)都是正确的文档(和标识)。
此外,语言本身是基于function级别的范围和闭包,所以大量的灵活性可以使variables在2+范围级别的块感到非常混乱,所以我已经看到命名的范围链中每个级别的前缀_
到那个范围的变数。
- 使用描述清楚它包含的variables。 如果class级变大,或者在公共范围内,variables名称需要更准确地描述。 当然,好的命名使得你和其他人更好地理解代码。
- 例如:使用“employeeNumber”而不是“数字”。
- 使用Btn或Button在variables名称的末尾重新button。
- 以小写开始variables,以大写开始类。
- 类“MyBigClass”的示例,variables“myStringVariable”的示例
- 使用大写字母来表示一个新的单词以提高可读性。 不要使用“_”,因为它看起来丑陋,需要更长的时间来写。
- 例如:使用“employeeName”。
- 只能在循环中使用单个字符variables。
我在MathCAD工作,我很高兴,因为MathCAD给了我不断增加的命名可能性,我使用它们很多。 如果没有这个,我就不会理解如何编程。 为了区分一个变种,我必须在名称中包含很多信息,例如:
1.首先 – 数量为-N,F为力量等
2.第二个附加指标 – 例如武力方向
3.在向量或matrixvar内的第三个索引中,为了方便起见,我把var名称放在{}或[]括号中以显示其维度。
所以,作为结论,我的var名称就像N.dirs / Fx i.row / {F} .w。(i,jk)/ {F} .w。(k,ij)。 有时我必须为vector值{F}。{GCS} .w。(i,jk)/ {F}。{LCS} .w。(i,jk)添加坐标系名称。
最后一步,在外部函数的末尾添加外部模块的名字,或者像Row.MTX.f([M])那样添加var,因为MathCAD没有函数的帮助string。
现在我做了很多的PHP,虽然并不总是这样,但是在variables命名方面,我学到了一些技巧。
//这是我的stringvariables$ strVar =“”;
//这将代表一个数组$ arrCards = array();
//这是一个整数$ intTotal = NULL:
// object $ objDB = new database_class();
//布尔值$ blValid = true;