如何命名变量

时间:2008-10-15 03:24:52

标签: language-agnostic naming convention

  • 您使用哪些规则来命名变量?
  • 单字母变量在哪里允许?
  • 你在名字中放了多少信息?
  • 例如代码怎么样?
  • 您首选的无意义变量名称是什么? (在foo& bar之后)
  • 他们为什么拼写"foo" and "bar"而不是FUBAR

24 个答案:

答案 0 :(得分:47)

function startEditing(){
   if (user.canEdit(currentDocument)){
      editorControl.setEditMode(true);
      setButtonDown(btnStartEditing);
   }
 }

应该像叙事作品一样阅读。

答案 1 :(得分:15)

我总是遵循的一条规则是:如果变量编码某些特定单位的值,那么这些单位必须是变量名称的一部分。例如:

int postalCodeDistanceMiles;
decimal reactorCoreTemperatureKelvin;
decimal altitudeMsl;
int userExperienceWongBakerPainScale

对于任何火星登陆器(或无聊的CRUD业务应用程序中的等效故障),我都不负责。

答案 2 :(得分:12)

这一切都取决于你正在开发的语言。由于我目前正在使用C#,我倾向于使用以下内容。

camelCase for variables。

camelCase for parameters。

属性的PascalCase。

成员变量的m_PascalCase。

单字母变量允许哪些内容? 我倾向于在for循环中这样做,但每当我这样做时感到有点内疚。但是对于循环的foreach和lambda表达式现在并不常见。

您在名称中放了多少信息? 如果代码有点难以理解写评论。不要将变量名称变成注释,即。 int theTotalAccountValueIsStoredHere 不是必需的。

您首选的无意义变量名称是什么? (在foo& bar之后) 我或x。 foo和bar对我来说有点太大学教科书了。

他们为什么拼写“foo”和“bar”而不是FUBAR? 传统

答案 3 :(得分:5)

这些都是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很多人都想到了,但它并不适用于这段特殊的代码,这就是为什么有一个评论。)变量名称?谁在乎?

答案 4 :(得分:4)

  • 我只使用单个字符变量进行循环控制或非常短的函数。
for(int i = 0; i< endPoint; i++) {...}

int max( int a, int b) {
    if (a > b)
       return a;
    return b;
}
  • 信息量取决于变量的范围,可以使用的位置越多,我想要有更多信息来跟踪其目的。
  • 当我编写示例代码时,我尝试使用变量名称,就像在实际代码中一样(尽管函数可能会变得像foo或bar这样无用的名称)。
  • 请参阅Etymology of "Foo"

答案 5 :(得分:4)

几乎所有广泛使用的现代语言都有自己的编码标准。这是一个很好的起点。如果一切都失败了,只需使用推荐的内容。当然也有例外,但这些都是一般指导原则。如果你的团队喜欢某些变体,只要你同意它们,那么那也没关系。

但是在一天结束时,它不一定是你使用的标准,而是你首先拥有它们并且它们被遵守的事实。

答案 6 :(得分:3)

您使用哪些规则来命名变量?

通常,因为我是C#开发人员,所以我遵循IDesign C# Coding Standard指定的变量命名约定,原因有两个

1)我喜欢它,并且发现它很容易阅读。 2)这是我最近广泛使用的Code Style Enforcer AddIn for Visual Studio 2005 / 2008附带的默认值。

单字母变量允许哪些内容?

有几个地方我会允许单字母变量。通常这些是简单的循环索引器,OR数学概念,如X,Y,Z坐标。除此之外,永远不要! (我在其他任何地方都使用过它们,在重读代码时我经常被它们咬过。)

您在名称中放了多少信息?

足以清楚地知道变量的用途。正如罗伯特马丁所说:

  

变量,函数或的名称   上课,应该回答所有的大事   的问题。它应该告诉你为什么   存在,它做什么,以及如何   用过的。如果名称需要评论,   然后这个名字没有揭示它   意图。   来自清洁代码 - 敏捷软件工艺手册

答案 7 :(得分:2)

我从不使用像foo或bar这样无意义的变量名,除非当然代码真的丢掉了。

对于循环变量,我将字母加倍,以便更容易在文件中搜索变量。例如,

for (int ii=0; ii < array.length; ii++)
{
    int element = array[ii];
    printf("%d", element);
}

答案 8 :(得分:1)

您使用什么规则来命名变量?我在单词(load_vars),驼峰套管(loadVars)和无空格(loadvars)之间切换了下划线。类总是CamelCase,大写。

单字母变量允许哪些?主要是循环。一次性代码中的临时变量。

你在这个名字中放了多少信息?在我编码的时候足以让我想起它是什么。 (是的,这可能会导致以后出现问题!)

您首选的无意义变量名称是什么? (在foo&amp; bar之后) temp,res,r。我实际上并没有使用foo和bar很多。

答案 9 :(得分:1)

您使用哪些规则来命名变量? camelCase用于所有重要变量,CamelCase用于所有类

单字母变量允许哪些内容?   在循环结构和数学函数中,单字母var名称与数学定义一致。

您在名称中放了多少信息?   你应该能够像书一样阅读代码。函数名称应该告诉你函数的作用(scalarProd(),addCustomer()等)

例如代码怎么样?

您首选的无意义变量名称是什么? (在foo&amp; bar之后)   temp,tmp,input,我从不真正使用foo和bar。

答案 10 :(得分:1)

我遵守的规则是;

该名称是否完整准确地描述了变量代表的内容?

名称是指现实问题而不是编程语言解决方案吗?

这个名字是否足够长,以至于您不必将其解开?

名称末尾的计算值限定符(如果有)吗?

它们是否仅在需要时才被实例化?

答案 11 :(得分:1)

您使用哪些规则来命名变量?

  • 我需要能够在一年的时间内理解它。还应符合既有风格。

单字母变量在哪里允许?

  • 非常明显的事情。例如。 char c; c = getc();循环指示(i,j,k)。

您在名称中放了多少信息?

  • 很多很多。

示例代码怎么样?

  • 与上述相同。

您首选的无意义变量名称是什么? (在foo&amp; bar之后)

  • 我不喜欢有无意义的变量名。如果变量没有任何意义,为什么它在我的代码中呢?

他们为什么拼写“foo”和“bar”而不是FUBAR

  • 传统。

答案 12 :(得分:0)

我在MathCAD工作,我感到高兴,因为MathCAD给了我更多的命名可能性,并且我经常使用它们。如果没有这个,我无法理解如何编程。 要使一个var与另一个不同,我必须在名称中包含大量信息,例如:

1.首先是 - 数量为-N,力量为F等等

2.在第二个附加指数 - 例如力量方向

3.在第三个 - 向量或矩阵var中的索引,为方便起见,我将var名称放在{}或[]括号中以显示其维度。

所以,作为结论,我的var名称就像 N.dirs / Fx i.row / {F} .w。(i,j.k)/ {F} .w。(k,i.j)。 有时我必须为矢量值添加坐标系的名称 {F}。{GCS} .w。(i,j.k)/ {F}。{LCS} .w。(i,j.k)

作为最后一步,我在外部函数末尾的BOLD中添加外部模块的名称,或者像Row.MTX.f([M])一样添加var,因为MathCAD没有函数的帮助字符串。

答案 13 :(得分:0)

我想说尽可能清楚地命名它们。永远不要使用单字母变量,只使用'foo'和'bar',如果你只是测试一些东西(例如,在交互模式下),并且不会在生产中使用它。

答案 14 :(得分:0)

  1. 使用明确描述其中包含内容的变量。如果类变大,或者它在公共范围内,则需要更准确地描述变量名。当然,良好的命名可以让您和其他人更好地理解代码。
    • 例如:使用“employeeNumber”而不仅仅是“数字”。
    • 在响应按钮的变量名称的末尾使用Btn或Button。
  2. 以小写字母启动变量,以大写字母启动类。
    • 类“MyBigClass”的示例,变量“myStringVariable”
    • 的示例
  3. 使用大写字母表示新单词以提高可读性。不要使用“_”,因为它看起来更丑,需要更长的时间来编写。
    • 例如:使用“employeeName”。
  4. 仅在循环中使用单个字符变量。

答案 15 :(得分:0)

由于我作为承包商工作,在不同的公司和项目之间移动,我更愿意避免使用自定义命名约定。它们使新开发人员或维护开发人员更难以熟悉(并遵循)所使用的标准。

因此,虽然可以在其中找到不同意的点,但我期待the official Microsoft Net guidelines获得一致的命名约定。

除了一些例外(匈牙利表示法),我认为一致使用可能比任何一组规则更有用。也就是说,每次都这样做。

答案 16 :(得分:0)

如何命名变量几乎不重要。除了语言指定的规则之外,您实际上不需要任何规则,或者至少是编译器强制执行的规则。

选择你认为你的队友可以找到的名字是有礼貌的,但是风格规则并不像人们想象的那样真正有用。

答案 17 :(得分:0)

我学会了在VB3时代不再使用单字母变量名。问题是,如果你想在任何地方搜索使用变量,那么搜索一个字母就很难了!

较新版本的Visual Studio具有智能变量搜索功能,可避免此问题,但旧习惯和所有这些。无论如何,我更喜欢在荒谬的一面犯错误。

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.
}

答案 18 :(得分:0)

我总是在for循环中使用单字母变量,它看起来更漂亮,更容易阅读。

很多都取决于你正在编程的语言,我没有像在Java中那样用C ++命名变量(Java更适合于过长的变量名imo,但这可能只是个人偏好。或者它可能与Java内置命名如何命名有关...)。

答案 19 :(得分:0)

在DSL和其他流畅的界面中,变量和方法名称通常形成一个词汇实体。例如,我个人喜欢(不可否认的异端)命名模式,其中动词被放入变量名而不是方法名。 @see 6th Rule of Variable Naming

另外,我喜欢简单地使用$作为一段代码的主变量的变量名。例如,一个非常打印树结构的类可以使用$作为StringBuffer inst var。 @see This is Verbose!

否则我会参考Einar Hoest的程序员短语手册。 @see http://www.nr.no/~einarwh/phrasebook/

答案 20 :(得分:0)

我喜欢为我的变量添加前缀:str = String,int = Integer,bool = Boolean等。

在循环中使用单个字母快速简便:对于i = 0到4 ...循环

变量是一个简短的描述性替代你正在使用的东西。如果变量太短,您可能无法理解它的用途。如果它太长,你将永远键入一个代表5的变量。

Foo&amp; Bar用于示例代码以显示代码的工作方式。您可以使用几乎任何不同的荒谬字符来代替。我通常只使用i,x和&amp;收率

我个人对foo bar vs. fu bar的看法是,它太明显了,没有人喜欢2个字符的变量,3个更好!

答案 21 :(得分:0)

当地人:fooBar; 成员/类型/功能FooBar 接口:IFooBar

就我而言,单个字母仅在名称为经典名称时有效; i / j / k仅用于局部循环索引,x,y,z用于矢量部分。

vars的名称可以传达意义,但足够短,不能包裹行

FOO,酒吧,巴兹。 Pickle也是最受欢迎的。

答案 22 :(得分:-1)

<强>更新

首先,命名取决于现有的约定,无论是语言,框架,库还是项目。 (在罗马时...)示例:使用jQuery style用于jQuery插件,使用Apple style用于iOS应用。前一个例子需要更加警惕(因为JavaScript会变得混乱并且不会自动检查),而后一个例子更简单,因为标准已得到很好的执行和遵循。 YMMV取决于领导者,社区,尤其是工具。

我会将所有的命名习惯放在一边,以遵循现有的惯例。


总的来说,我遵循这些原则,所有这些原则都以编程为中心,是通过书面语言进行人际交流的另一种形式。

  • 可读性 - 重要部分应具有可靠的名称;但这些名称不应取代 intent 的正确文档。对代码可读性的测试是,如果你可以在几个月后再回到它,并且仍然足够理解,不要在第一印象时抛弃整个事物。这意味着避免缩写;见the case against Hungarian notation

  • 可写性 - 公共区域和样板应该保持简单(特别是如果没有IDE),因此编写代码更容易,更有趣。这有点受到Rob Pyke's style的启发。

  • 可维护性 - 如果我将类型添加到我的名称arrItems,那么如果我将该属性更改为CustomSet的实例,则会很糟糕扩展Array的类。类型说明应保存在文档中,并且仅在适当时(对于API等)。

  • 标准,通用命名 - 对于愚蠢的环境(文本编辑器):类应该在ProperCase中,变量应该很短,如果需要,可以在snake_case中和函数应该在camelCase


对于JavaScript,它是语言限制和影响命名的工具的经典案例。它有助于通过不同的命名来区分变量和函数,因为在thisprototype以及其他样板模糊您的视觉并混淆您的差异化技能时,没有IDE可以握住您的手。在范围中看到所有不重要或全局派生的变量都是缩写的并不罕见。该语言没有import [path] as [alias];,因此本地变量成为别名。然后是一系列不同的白人会议惯例。这里(以及任何地方,真的)唯一的解决方案是对意图(和身份)的正确记录。

此外,语言本身是基于功能级别的范围和闭包,因此灵活性的大小可以使具有2+范围级别的变量的块感觉非常混乱,所以我看到命名_前置的地方对于范围链中的每个级别,该范围内的变量。

答案 23 :(得分:-2)

我现在做了很多PHP,虽然并不总是这样,但在变量命名方面我学到了一些技巧。

//这是我的字符串变量 $ strVar =“”;

//这将代表一个数组 $ arrCards = array();

//这是一个整数 $ intTotal = NULL:

//对象 $ objDB = new database_class();

//布尔 $ blValid = true;