【问题标题】:Better identifier names? [closed]更好的标识符名称? [关闭]
【发布时间】:2010-02-07 08:42:37
【问题描述】:

如何训练自己给出更好的变量和函数名称(程序中的任何用户定义名称)。

【问题讨论】:

    标签: naming-conventions naming identifier


    【解决方案1】:

    练习。

    每当您编写或阅读代码(包括其他人的代码)时,请始终考虑这一点。试着弄清楚你会在他们的代码中做些什么不同的事情,并在可能的情况下与他们讨论(但不要喋喋不休,那会很麻烦)。问他们为什么选择某个名字。

    看看您的代码在没有 cmets 的情况下的读取效果如何。如果您需要评论您命名的事物的基本目的,请考虑是否可以有一个更好的名称。

    最重要的是积极的心理参与:练习。

    【讨论】:

    • 在 cmets 点上,我发现测试是如果您在三天后回来并且无法立即理解您所做的事情,那么您可能命名错误(或写得很糟糕但让我们先做第一件事)。
    【解决方案2】:

    想名字似乎是一些人非常不擅长的事情,我不确定有什么治疗方法。当我还是一名从事商业培训的讲师时,我经常会看到这样的情况:

    我:好的,现在你需要创建一个整数变量来包含 getchar() 返回的值。

    [学员开始打字,我在培训室里转悠。大多数人都做得很好,但一个人像鹿一样坐着,冻住了车头灯]

    我:有什么问题?

    他:我想不出这个变量的名字!

    所以,我会给他们一个名字,但我感觉有这个问题的人在编程方面不会走得太远。或者问题可能是他们走得太远了......

    【讨论】:

    • 'x' 是一个字母?一个符号?一个数字?
    • @Nick 一个变量名——显然,我告诉他们这样称呼它会参考他们正在解决的问题。但归根结底,我主要教授的课程是关于编程语言(通常是 C 和 C++)的语法和语义,而不是关于一般的最佳实践,所以不可能就命名事物进行冗长的讨论——如果他们愿意,他们可以来参加我们的 OOD 课程 :-)
    【解决方案3】:

    这是一个主观问题。

    我努力使我的代码与库(或至少与标准库)保持一致,以便代码具有统一性。我建议:看看标准库函数是如何命名的。寻找模式。了解存在哪些不同的命名约定。看看哪一个最有意义。例如:大多数 Java 代码使用非常大的标识符名称、Camel 大小写等。C 使用简洁/短名称。然后是匈牙利符号——当编辑器不够聪明,无法为您提供类型信息时,这是值得的。现在,你可能不需要它了。

    【讨论】:

      【解决方案4】:

      乔尔·斯波尔斯基几年前写了a helpful article on Hungarian notation。他的主要见解是:

      让我们试着想出一个编码 约定将确保如果 你曾经犯过这个错误,代码 只会看起来不对。如果代码错误, 至少,看起来不对,那么它有一个 争取被抓住的机会 有人在处理该代码或 审查该代码。

      他接着展示了如何以严格的方式命名变量可以改进我们的代码。关键是,避免错误比使我们的代码更“可维护”具有更快和更明显的投资回报率。

      【讨论】:

        【解决方案5】:

        阅读一些好的代码并模仿它。这是学习任何东西的普遍方式;只需用适当的词替换“阅读”和“代码”即可。

        【讨论】:

          【解决方案6】:

          找到富有表现力的名称的一个好方法是从文本描述您的软件实际功能开始。 函数(方法)名称的好候选者是动词,用于类名词。 如果你先做设计,一种方法是textual analysis

          【讨论】:

            【解决方案7】:
            • (即使您只是一个由 1 人组成的团队)与您的同事商定编码标准,以便大家使用相同的命名约定。 (例如,对于快速返回的值,通常使用属性,但对于需要时间计算的值,使用 GetXXX 或 CalculateXXX 方法。这种约定让调用者更好地了解他们是否需要缓存结果等)。尝试对等效概念使用相同的名称(例如,不要像 Microsoft 在 .net 中那样混合使用 Array.Count 和 List.Length!)

            • 尝试像其他人编写的那样阅读您的代码(即忘记您所知道的一切,只阅读它)。是否有意义?它是否解释了他们理解它需要知道的一切? (可能不会,因为我们都忘记描述我们“知道”或“显而易见”的东西。返回并澄清命名和文档,以便其他人可以拿起您的代码文件并轻松理解它)

            • 保持名称简短但具有描述性。写一个完整的句子是没有意义的,但是在大多数 IDE 中都有自动完成功能,除非它是一个非常标准的缩写,否则缩写任何东西也没什么意义。

            • 不要浪费字符告诉别人这个字符串是一个字符串(匈牙利符号的常见解释)。使用描述某事物作用以及如何使用的名称。例如我使用前缀来表示用法(m=member、i=iterator/index、p=pointer、v=volatile、s=static 等)。这是访问变量时的重要信息,因此它是对名称的有用补充。它还允许您将一行代码复制到电子邮件中,并且接收者可以准确理解所有变量的含义 - 静态 volatile 和参数之间的用法差异通常非常重要。

              李>
            • 在名称中描述变量的内容或方法的用途,避免使用技术术语,除非您知道代码的所有读者都知道这些术语的含义。使用您能想到的最简单的描述 - 复杂的单词和技术术语听起来很聪明且令人印象深刻,但更容易被误解(例如,在我的脑海中:Collat​​ion 或 SortOrder、Serialise 或 Save - 尽管这些是众所周知的词编程所以不是很好的情况)。

            • 避免使用模糊和近乎无意义的术语,例如“值”、“类型”。对于基类属性尤其如此,因为您最终会在派生类中得到一个“类型”,并且您不知道它是哪种类型。使用“JoystickType”或“VehicleType”,意思立马清晰很多。

            • 如果您使用带有单位的值,请告诉人们名称中的含义(角度度而不是角度)。这个简单的技巧将阻止你的宇宙飞船撞向火星。

            • 对于 Visual Studio 中的 C#、C++、C,尝试使用 AtomineerUtils 将文档 cmets 添加到方法、类等。此工具从您的姓名派生自动文档,因此您的姓名越好,文档是,您在完成文档时需要付出的努力就越少。

            【讨论】:

              【解决方案8】:

              阅读“代码完成”一书,更具体地说是第 11 章关于命名的内容。这是清单(来自here,需要免费注册):

              一般命名注意事项

              名称是否完整准确地描述了变量所代表的内容? 这个名字是指现实世界的问题而不是编程语言的解决方案吗? 这个名字是否足够长,你不必把它弄糊涂? 计算值限定符(如果有)是否位于名称的末尾? 该名称是否使用 Count 或 Index 而不是 Num?

              命名特定类型的数据

              循环索引名称是否有意义(如果循环长度超过一两行或嵌套,则不是 i、j 或 k)? 是否所有“临时”变量都被重命名为更有意义的东西? 是否命名了布尔变量,以便它们为 True 时的含义清晰? 枚举类型名称是否包含指示类别的前缀或后缀?例如,Color_ 代表 Color_Red、Color_Green、Color_Blue 等等? 命名常量是根据它们所代表的抽象实体而不是它们所引用的数字来命名的吗?

              命名约定

              约定是否区分本地、类和全局数据? 约定是否区分类型名称、命名常量、枚举类型和变量? 约定是否以不强制执行它们的语言识别例程的仅输入参数? 该约定是否尽可能与该语言的标准约定兼容? 名称的格式是否便于阅读?

              简称

              代码是否使用长名称(除非必须使用短名称)? 代码是否避免只保存一个字符的缩写? 所有单词的缩写是否一致? 名字可发音吗? 是否避免使用可能被错误发音的名称? 短名称是否记录在翻译表中?

              常见的命名问题:您是否避免...

              ...具有误导性的名称? ...具有相似含义的名称? ...名称仅相差一两个字符? ...听起来相似的名字? ...使用数字的名称? ...名称故意拼写错误以使其更短? ...通常用英语拼写错误的名字? ...与标准库例程名称或预定义变量名称冲突的名称? ...完全任意的名字? ...难以阅读的字符?

              【讨论】:

                猜你喜欢
                • 2010-10-24
                • 1970-01-01
                • 1970-01-01
                • 2012-07-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-09-29
                • 2015-04-21
                相关资源
                最近更新 更多