作者丨Daan

译者丨王文刚

策划丨万佳

对一个人来说,名字很重要,俗语说“人如其名”。对程序中的变量而言,名字同样非常重要。

作为开发人员,你要花费大量的敲代码时间来创建变量和考虑给变量起个名字。名字无处不在。你可以命名文件、类、方法和变量。而命名的不同导致有的是好代码,有的是糟糕的代码,最终这会严重影响代码维护的成本。

由于我们花费大量时间命名变量,因此做好它非常重要。在本文中,我将向你展示一些简单的规则,你可以遵循这些规则来创建名字。

在代码中起名本身就是一门艺术!

1名字要显示真正意图

这说起来容易做起来难。你多久遇到一次变量名,而这些变量名没有告诉你有关变量的真实信息?

一个好的经验法则是:如果一个名字需要注释,那么它并不是真实意图的命名。

编程大师 Robert C. Martin 在《Clean Code》中说道:“使用注释是为了弥补我们代码表意上的不足。”

这句话意味着如果你的代码需要添加注释,就说明你的代码还不够好。同时,这也说明如果不能在单纯的代码中展示你对问题或算法的理解,这是非常失败的,你只能依靠一些注释说明你的想法,而不能仅用代码。

优秀的代码可以让人在没有注释的情况下看懂并理解,好的编程习惯也是让所有必要的信息都在代码中展示出来。

以下代码段是一个变量,它不能揭示真正的意图:

<?php   private $s; // Time in seconds

变量 $s 没有显示任何意义。

它不会看到任何时间流逝的含义。最好选择一个名称,该名称指定要测量的内容以及该测量的单位。因此,很重要的一点就是,程序员要用代码准确的表达出自己的思想,从而让其他人明白程序的含义。

下面的示例中的变量名会更好,任选其一。

<?php    private $days_since_creation;   private $elapsed_time_in_seconds;   private $seconds_since_last_modified;

选择显示意图的名称可以使理解一段代码变得更加容易,因此也易于维护。

选择名字需要时间,但是比起维护代码,整体节省时间要多得多。

让我们看一下以下示例:

<?php  function getList() {    $list1 = [];   foreach ($this->the_list as $x) {    if ($x % 2 != 0) { $list1[] = $x; }   }   return $list1;  }   function getOddNumbers() {  $odd_numbers = []; foreach ($this->numbers as $number) {    if (isOdd($number)) {   $odd_numbers[] = $number;  }   }   return $odd_numbers;    }

为什么 getList 函数的作用这么难辨别?它并没有复杂的表达式。代码已缩进并正确格式化。只使用了三个变量,没有花里胡哨的东西。

再看一下 getOddNumbers 函数。你是否看到该函数与 getList 函数完全相同?

注意,代码的复杂度没有改变。它仍然具有完全相同数量的运算符和变量,以及完全相同数量的嵌套逻辑。唯一改变的是代码命名变得更加明确。

通过简单的名称重构,我们很容易分辨出这段代码的功能。

2使用某一领域背景中有意义的名字

程序员写的所有代码都是和某一领域背景相关的,为了让写出的代码可以让个更多的人理解,最好使用该领域背景下的名字。

不好的代码示范:

public class  EntitiesRelation
{
Entity o1;
Entity o2;
}

当你在编写针对某个领域的代码时,你应该使用领域背景相关的名字。如果以后有另外的人(不仅是程序员,也许是测试人员)接触你的代码时,他能轻松的理解你写背景相关的代码含义。

所以,程序员首先应该考虑的是领域背景问题,之后才是如何出解决方案。

清晰的代码示例:

public class  ProductWithCategory
{
Entity product;
Entity category;
}

3避免误导信息

你应该避免留下掩盖代码含义的错误提示。

避免误导其含义与预期含义有所差异的词。例如,不要将产品分组称为 productList,除非它实际上是 List 类型的对象。这可能导致错误的结论。命名为 products 更好。

Product[] products;

你可能选择的最差的变量名称是大写的 O 和小写的 L。这是因为它们看起来很像 0 和 1。

当心使用名称变化很小的名称。发现一个文件中的 SomeMethodForEfficientHandlingOfFiles 和另一个文件中的 SomeMethodForEfficientStorageOfFiles 之间的细微差别需要多长时间?乍一看,这些名称看起来相同。

导致误解的信息比没有信息更糟糕,有些程序员喜欢“隐藏”一些重要信息,但更糟的是,他们有时会写出一些让人误解的代码。

 命名混淆:一个词不要表示多种概念

定义场景中的概念很难,在软件开发过程中,程序员需要花费很多时间去分析某一场景,并命名场景中的各种元素,这样的工作永远都是让程序员头疼的事情。

不好的代码示例:

//1.
void  LoadSingleData();
void  FetchDataFiltered();
void  GeteAllData();
//2.
void  SetDataToView();
void  SetObjectValue(int value);

在第一段代码中,这个程序员想表达“获取数据”这个概念,但他用了很多不同的词”load”,”fetch”, ”get”。在一个场景下,应该用一个统一的词表示这个概念。

在第二段代码中,”set”一词被用作了两个概念,第一个是“取出数据显示”,第二个是“为一个对象赋值”,应该用不同的词表示这两个不同的概念。

清晰的代码示例:

//1.
void  GetSingleData();
void  GetDataFiltered();
void  GetAllData(); //2.
void  LoadDataToView();
void  SetObjectValue(int value);

4做出有意义的区分

数字系列命名不是一个命名的好方法。这样的名称是非信息性的,因为它们没有提供代码作者意图的任何提示。

让我们看下面的例子:

<?php  public function duplicateArray($arr1, &$arr2) { foreach ($arr1 as $key => $value) { $arr2[$key] = $value;  }   }

当将 arr1 和 arr2 重命名为 source 和 destination 时,此代码将更好地阅读。

5使用可以发音的单词

如果不能说出名字,那么你就不能在听起来像个白痴的情况下讨论它。这实际上很重要,因为编程的一部分工作是社交活动,每个人都有很大的机会知道自己无法发音的变量名称。

假设我们有一个名为 $xsq 的变量名,这对贵公司来说是一个非常重要的缩写。想象一下与同事的对话:

“嘿,那可变的 eks ess kjew 呢?”

“你是说访问队列?”

一些开发人员将尝试将变量发音为一个单词。其他人会拼出这个词。

 变量命名:使用在上下文有意义的名字

代码里的名字都有自己的上下文,上下文对于理解一个代码是很重要的,因为它能提供额外的信息。我们来看一个典型的“地址”上下文:

不好的代码示例:

string addressCity;
string addressHomeNumber;   > string addressPostCode;

在大多数情况中,“邮政编码”(PostCode)是地址的一部分,很显然,邮政编码不能单独使用(除非你是在开发一个专门处理邮编的应用)。

所以,没有必要在“PostCode”的前面加上“address”。而且,所有的这些信息都应该有一个上下文环境,在面向对象编程中,这里应该用一个“Address”类来表达这个地址信息。

清晰的代码示例:

class Address
{
string city;
string homeNumber;
string postcode;    > }

6使用可搜索的名称

由一个字母组成的名称,可能存在难以定位的问题。

数字常量也是如此。数值常量可以用常量变量代替。搜索代码时,数字 8 可能会给你带来很多麻烦。

但是,用常量 MAX_BLOCKS_DISPLAYED 替换它会使它变得更容易。

单字母名称的唯一用例是简短方法中的局部变量。

7命名前缀

不要使用前缀。

例如,某些开发人员习惯在所有私有成员前面加上下划线。别,你的类和方法应该足够短小,以至于不需要任何这些前缀。或者,你可以使用 IDE(或安装插件),该 IDE 根据变量的范围会为变量着色。

8结论

这样,你可以在代码中创建更有意义的名称。

作为一名程序员你应该:

1、起的名字有意义,可以表达一个概念

2、要考虑名字的长度,名称中只有必要信息

3、符合“编码规范”,有助于理解

4、一个概念不要多个名字混用

5、使用在背景领域和上下文中都有意义的名字

本文的灵感来自罗伯特·C·马丁(Robert C. Martin)所著的《清洁代码》(Clean Code),我强烈建议你仔细阅读。

原文链接:

https://medium.com/better-programming/how-to-create-meaningful-names-in-code-20d7476537d4

往期推荐

扫码关注我们

dotNet全栈开发
入群方式:公众号内回复"加群"
关键字回复:"资源"
领取c#|前端 入门进阶教程资源

如何给程序中的变量起个好名字?相关推荐

  1. MATLAB程序中使用变量获取到某代码段的运行时间

    ** 在实时仿真过程中,需要实时获取到某段程序的运行时间,以便根据时间变化来调整对象的变化参数. 比如GPSR路由协议应用于车联网时,在模拟交通场景时需要实时根据程序运行时间和节点速度更改节点的位置信 ...

  2. spark 获取广播变量_Spark流式程序中广播变量和累加器为何使用单例模式

    Spark中广播变量详解以及如何动态更新广播变量​mp.weixin.qq.com 1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销 2. ...

  3. java程序中的变量_Java中的变量

    实例变量的作用域与对应实例的生存范围相同,而类属性的作用域与这个类的生存范围相同.成员变量无须显式初始化,系统会默认初始化. 与成员变量不同的是,局部变量除了形参之外,不必须显式初始化,否则不可以访问 ...

  4. 微课系列(5):Python程序中__name__变量的用法

    技术要点: 1)Python程序也可以当作模块来使用. 2)当Python程序直接运行时,__name__变量的值是字符串'__main__' 3)当Python程序当做模块使用时,__name__变 ...

  5. 如何优雅地为程序中的变量和函数命名

    作者:何新宇 链接:https://www.zhihu.com/question/21440067/answer/24522844 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  6. 微信小程序中的变量和作用域

    一,全局变量 在app.js里的变量和方法是全局的. //app.js App({onLaunch: function () {// 展示本地存储能力var logs = wx.getStorageS ...

  7. python 函数变量_Python函数中的变量和函数返回值

    1.函数的变量 局部变量和全局变量: Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变 ...

  8. python老是报参数未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  9. 如何对PHP程序中的常见漏洞进行攻击(上)

    如何对PHP程序中的常见漏洞进行攻击(上) 创建时间:2001-07-17 文章属性:翻译 文章来源:http://www.china4lert.org 文章提交:analysist (analysi ...

最新文章

  1. linux 库函数拦截,如何使用net_dev_add()API过滤和拦截Linux数据包?
  2. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  3. Java黑皮书课后题第3章:*3.3(代数:求解2*2线性方程)编写程序,提示用户输入a、b、c、d、e和f,然后显示结果
  4. 010 pandas的DataFrame
  5. Mybatis学习笔记18 - 缓存
  6. 数据结构与算法之-----二叉树(二)
  7. 【ROS】ros入门21讲(下)
  8. 11.策略模式(Strategy Pattern)
  9. 什么是用户价值分层?
  10. python句柄无效_使用pyinstaller打包,subprocess报“句柄无效”错误的解决方法
  11. 交换机之三层交换原理
  12. FX系列DSZR回原点指令结束后M8029不亮的解决方案
  13. 关于relief算法选择特征的问题
  14. ubuntu8.10解决flash乱码问题!
  15. 微信小程序商城毕业设计毕设作品(3)后台功能
  16. 震区归来话旅游867
  17. Mysql 数据库(一)
  18. linux驱动设备开发1——字符设备驱动
  19. Android原生视频播放器下载,视频播放器:VideoPlayer下载_视频播放器:VideoPlayer官方下载【手机安卓版】-华军软件园...
  20. 如何利用软文让你的产品广告上百度首页

热门文章

  1. python的json格式输出_python中json格式数据输出实现方式
  2. 清远城市品牌将携五大百亿农业产业区域公用品牌齐亮相
  3. 【源码】直流电机速度控制的Simscape模型
  4. 初冬,居然没有预想中的寒意
  5. ES6学习(变量解构赋值)
  6. Moment for Mac(菜单栏倒数日应用)
  7. diameter协议栈_Diameter协议结构原.ppt
  8. 记录--两行CSS让页面提升了近7倍渲染性能!
  9. linux下的freeradius(802.1x)服务器搭建总结
  10. 第十七周-day71-Python编程基础day03