【问题标题】:Do you use 1-3 letters variables EVERYWHERE? [closed]您是否在任何地方都使用 1-3 个字母的变量? [关闭]
【发布时间】:2011-01-05 18:39:12
【问题描述】:

我注意到,在 C# 中,我在任何地方都使用非常短的变量名。我的代码被污染了

foreach(var (v|f|i) in SOMETHING)

for(int (i|n|z)=0

var (ret|r) = blah();
...
return ret;

var sw = new StringWriter();

using(var r = cmd.ExecuteNonQuery()) {
    while(r.Read()) {
        r.GetSomething(3)

我不知道这是坏还是好的。我当然可以阅读它。我 5 个月前或更早之前没有看过代码,所以我不能说我是否理解旧代码。我所有的函数都很短,只做一件事,所以通过阅读函数,您可以很好地了解变量是什么,特别是因为函数中有

人们过去常常对我大喊不使用好的变量名。我没有使用好的变量名还是可以?

【问题讨论】:

标签: c# language-agnostic variables coding-style


【解决方案1】:

编写供人类阅读的代码。 一个好的经验法则是变量的使用范围越大,其名称就应该更具描述性。函数参数尤其应该具有非常具有描述性的名称,但参数作用显而易见的函数除外,如
double sqrt(double n)

但是,如果它通常是一个短名称并在小范围内使用,那么请使用短名称。示例:

//these are okay
var sb = new StringBuilder();
var sw = new StringWriter();
var cmd = new SqlCommand();
for(var i = 0; i< count; i++) {}

【讨论】:

  • +1 - 宾果游戏。 (还有更多文字,因为这条评论太短了......)
  • 这对于那些仅仅存在就决定了它们的工作的东西来说是一个很好的建议,比如 StringBuilders 或 StringWriters,除了“它正在构建一个字符串,伙计”之外,你通常无话可说。但是对于目的可能不明确的事物,即使是在很短的范围内,一个描述性的名称也是值得的。例如。 int iint indexint countint totalint i 没有告诉我们 int 是什么用于int count 的清晰度是值得的,即使它只在三行的范围内。
  • 我真的不同意这一点。变量不应以类型命名,而应以其包含的内容命名。示例:如果您使用 StringBuilder 为电子邮件构建复杂的正文文本,则只需将变量命名为 body。
  • @Jan 好的,如果您使用 StringBuilder 构建查询字符串,然后需要将其转换为字符串并使用字符串位置,该怎么办。您是否希望我们拥有名为 QueryStringBuilderQueryString 的非常短暂的变量?
  • @Earlz:嗯,或多或少。我会像你一样在名称中包含类型,我可能会删除“字符串”,并以小写字母开头,即queryBuilderqueryString。但我想我可能只是有一个StringBuilder query 变量并转换为返回行中的字符串,如下所示:return query.ToString();
【解决方案2】:

除非您的代码被缩小,否则您不应该到处看到这样的变量。您的代码应该易于理解。

我记得听说我们应该把所有的代码都当作下一个管理我们项目的人是一个知道你住在哪里的精神病杀手。

【讨论】:

  • 关于你的第二段,传统的提法还包括“谁知道你住在哪里”这句话。 (开个玩笑:一个人想抢占先发制人的反应,“是的,但我在乎什么,到时候我就走了。”)
【解决方案3】:

局部变量使用短变量名是可以的,只要范围有限。

就个人而言,我发现对于简单的使用而言,简短的变量名称往往比较长的变量名称更易于阅读。

using (StreamReader sr = new StreamReader(inputStream))
{
    sr.ReadByte();
} 

相对于:

using (StreamReader streamReader = new StreamReader(inputStream))
{
    streamReader.ReadByte();
} 

这真的是关于可读性。每种情况都不同,开发团队也不同。遵循项目的编码标准(如果存在)。如果没有,请遵循现有代码库的样式(如果存在)。

我同意这里的一些答案,即变量名称应该有好的名称。但我相信这是假设一个对象具有 semantic 价值。有时,它不会。在某些情况下,您只需要一个特定对象的实例来执行一些小任务,之后它就变得无关紧要了。在这种情况下,我认为缩写标识符是可以接受的。

注意:仅仅因为变量的使用在其范围内受到限制并不一定意味着无意义的名称是可以的。如果有一个好的名称可以代表对象的功能,那么应该使用它。如果你能想出一个变量名来回答“为什么?”,那么这个名字就更可取了。

此外,开发人员非常了解使用“i”和“j”作为for 索引。按照惯例,loop counter variables have been named this way 自 FORTRAN 时代以来。

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        PerformOperation(i,j);
    }
}

【讨论】:

  • 太棒了。公元前我只为局部变量(从不参数或成员)这样做,它们总是在有限的范围内! (就这么多)。
  • acidzombie24:不要这么快就将其视为信任投票。 Matt 说:“我同意这里的一些答案,即变量名称应该有好的名称。但我认为这是预先假定对象具有 语义 值。有时,它没有。”但反过来说,通常是这样。即使函数少于 20 行。 20 行范围并不意味着您可以调用所有整数变量 i、j、k 等。等等,k 是最后检查的索引还是到目前为止的总数?
  • @itowlson:是的,我同意这一点。我在回答中添加了一些内容以反映这一点。
  • @马特。您说使用“i”和“j”可能会被开发人员很好地理解 - 但问他们为什么 i & j 而不是 a & b。我相信他们会毫无头绪。单字母变量应该是一个悬而未决的罪行 - 无论范围如何。当您开始维护其他人的代码时,您会很快意识到搜索“i”可能有点令人沮丧。别做人。这表明程序员很差或懒惰。
  • @cudamaru。循环计数器变量按照惯例以这种方式命名。这是一种源于编程历史的简单命名模式。
【解决方案4】:

几年前,我发现如果我将函数缩短会发生什么:

  • 我能理解它们。我的大脑很小,长功能不适合。

  • 类变得复杂(很多功能)。但是 Extract Class 产生了小的、有凝聚力的、单一用途的类。再说一次,小脑袋,所以需要小班

  • 函数(或类)中的变量数量很少。从声明时间到使用时间,记住哪个是哪个很容易,因为距离很短

  • 我的函数中作用域的数量很少,所以我不必弄清楚哪些变量放在哪里。

有了所有这些,我如何命名变量并不重要。这些名称不必弥补难以理解的代码。

由于作用域中的变量数量很少,而且目的很明显,所以我很少需要花任何精力来选择描述性名称。因为我不想让我的小脑袋过度劳累,所以我从不缩写。我的变量默认名称是类型的名称。例如。类Foo 进入变量foo。在我的代码中,如果它有任何不同,你就知道发生了一些特别的事情,你应该注意。

在过去,我不使用缩写的习惯会产生笨拙的代码,但由于我的方法和类很小,所以代码不会受到影响。

【讨论】:

  • 你几乎得到了 +1,直到我到达“我从不缩写”。现在,我有一个名为std::vector&lt; std::pair&lt; std::string, std::map&lt;int, Worker&gt; &gt; &gt; 的类(这是名称的简称,顺便说一句)。我应该给它的实例起什么名字?
  • 因为我的目标是编写我能理解的代码,所以我从不编写 C++。对不起。
  • -1。我看不到
  • @Captain:我不认为 StringBuilder stringBuilder = new StringBuilder();,不用担心sb 是指StringBuilder 还是StreamBuffer。我确实同意记住变量的目的需要付出努力,即使对于小函数也是如此。但是当一个函数只有 1-3 行时,风险就很低了。函数中的变量数量很少。它们的目的很明显,很难将它们混合在一起。他们的名字是微不足道的。
  • 赞成从不缩写
【解决方案5】:

这不仅仅是一个好的变量名称的问题(这是一个好主意),而是如果其他人可以依靠 cmets 以及 变量名称。

当然,对于诸如计数器或简单动作之类的东西,简短而简洁的名称是有意义的。对于更复杂的算法或更难阅读的内容,您需要详细说明代码清晰

每个商店和每个开发者都是不同的。在一天结束的时候,尝试为下一个可能需要维护它的人编写代码,考虑

【讨论】:

    【解决方案6】:

    在循环或定义良好的短块中使用一个字母的变量名作为索引通常被认为是可以的。但是,对于诸如函数参数和局部变量之类的事情,使用描述性的骆驼案例名称可以向阅读您的代码的其他人传达含义并没有错。

    【讨论】:

      【解决方案7】:

      除了有限的例外,不 - 这是不行的。单个字母或过度缩写的变量名称不再是任何借口。即使您是一个打猎和啄食的打字员,智能感知也意味着您几乎不需要拼写任何内容。如果您继续以这种方式命名变量,那么您就是在惩罚自己任何不幸被委派维护您的代码的人。

      【讨论】:

      • 真的吗?如此流利的样式代码,其中变量名称太短以至于不存在是不允许的?
      • for(i = 0; i
      【解决方案8】:

      我会认为这是一种糟糕的编码风格吗?嗯,是的。

      如果您与我一起处理相同的代码,我会反复提醒您更好地命名变量。简而言之,好的代码应该可以被其他开发人员轻松阅读,而好的变量名会大有帮助。也许你在阅读你的代码一段时间后也不会遇到问题,但问题是从未从事过这种工作的人是否也能接受它。

      有一些例外情况我认为短变量名是可以的:

      索引(主要在 for 循环中),例如:

      for (int i = 0; i < 10; i++)
      {
      }
      

      在非常有限的范围内使用的变量,例如 Linq 查询、lambda 表达式或已经提到的一些示例,例如 Streamwriters 和 -readers 等,这是我认为短变量名很好的另一个示例。

      此外,您的代码最终的可读性始终是一个问题。我经常对使用短变量名的人唠叨的原因是,对我来说,这表明他们通常不关心他们的代码的可读性(尤其是对其他人而言)。

      【讨论】:

        【解决方案9】:

        我不知道当你有这样的变量名时如何跟踪事情。

        通常,使用更长的名称来实际描述变量会更好。要努力的事情是让任何人都能够阅读代码并理解发生了什么,能够理解它们的用途等等 =)

        【讨论】:

        • 就像我说的,
        【解决方案10】:

        我的变量名称的平均长度似乎每年我编写(更重要的是阅读)代码的时间都会增加一倍。

        【讨论】:

          【解决方案11】:

          只需查看几行代码,就应该立即清楚任何变量的用途。这可能是由于一个好的变量名或上下文。

          关于我唯一使用短变量名的情况是,如果短名称是完全描述性的(即,在处理坐标的情况下,x & y)或者它是一个对数据类型进行操作的实用函数(即,大写这个字符串的第一个字母。它是一个字符串,你还能说什么?我把它命名为S。)

          【讨论】:

            【解决方案12】:

            我可能不知道代码后面的“r”是什么。此外,变量名是一回事,但您应该为详细解释注释代码。 注意:这应该是一个社区 wiki,因为没有明确的答案。

            【讨论】:

            • 我认为一个明确的答案。就像地球的形状问题,会有人认为它是平的,但总体上会达成一致……
            • 这是一个中肯的评论。我想我的意思是从客观的角度来看,但正如你所说,这可能是一个共识。
            【解决方案13】:

            这很糟糕。这是无法维护的。

            短变量有它们的位置。真的没有理由写 for(int 迭代器;迭代器

            经验法则是:每个屏幕可触及一个字母。具有标准化的 24 行屏幕。

            例外情况是选择一两个非常常用的全局变量或半全局变量,例如指向数据存储的指针或输入数据指针,并使它们的长度为 1-3 个字母。但除此之外 - 使用理由。短循环 - 一个字母。函数的局部变量 - 3-5 个字母。类变量 - 完整的单词。库类/函数名称 - 两个词。

            【讨论】:

            • 我没有在我的问题中明确地说出来(虽然不难说)但我的意思是局部变量。我同意你所说的。 +1。
            【解决方案14】:

            我看不出有任何理由使用无意义的短变量名。我们生活在 21 世纪,我们拥有带有 IntelliSense(或其他自动完成功能)的 IDE!只需按 Ctrl+Space,它会根据变量类型为您的变量提供 正常 名称,例如

            StringBuilder <Ctrl+Space> stringBuilder;
            List<Person> <Ctrl+Space> persons;
            

            这比键入 sb 或其他短名称更容易。没有理由再使用短名称了。

            P.S.:对我来说唯一的例外是 for 循环中的 i, j, k 之类的计数器。

            【讨论】:

            • 只是 bc 它可以生成名称,但这并不意味着我想使用它。如果我使用 var 似乎不起作用,而且我可以拥有 2 个 stringBuilder,所以拥有 stringBuilder2 几乎没有意义。这在 2008 年似乎也不起作用,因为 StringWriter 会显示一个类列表。我仍然不同意,并且认为这些名称没有用。
            • 如果我想使用 var,我遵循以下技术: 1. 编写变量类型而不是 var 2. 生成名称 3. 建议适当的构造函数(通常有用) 4. 用 var 替换类型(例如 R # 允许通过按 Ctrl-Enter 和 Enter 来完成)所以我不需要输入变量名和构造函数,只需要两个额外的按键。
            【解决方案15】:

            我更喜欢结合描述性 cmets 的简短“神秘”变量(符号,在 Mathematica 中)。

            Mathematica 已经为内置命令提供了 VeryLongFunctionNames,添加我自己的代码通常会使代码展开超出我的关注范围。

            我发现阅读更短的代码块更容易,我可以一次看到所有内容以及一系列符号描述。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-18
              • 2010-09-17
              • 2011-01-23
              • 2013-11-27
              相关资源
              最近更新 更多