miaoshi的gravatar头像
miaoshi 2016-03-15 20:19:56
java变量命名要能揭示意图

1:如何命名,在编程中这永远都是个老大难问题。有些程序员喜欢简化、缩短或加密名称,使得只有他们自己能懂。下面让我们看一些例子:

不好的代码:

       int d;// 天数
       int ds;
       int dsm;
       int faid;“d”可以表示任何东西。作者使用注释来表明他的意图,却没有选择用代码来表示。而“faid”很容易导致误解为ID。

清楚的代码:

      int elapsedTimeInDays;
      int daysSinceCreation;  
      int daysSinceModification;
      int fileAgeInDays;

2:命名时避免含义引起误解的信息: 
错误的信息比没有信息更糟糕。有些程序员喜欢“隐藏”一些重要信息,有时候他们也会写出一些让人误解的代码。

不好的代码:

     Customer[] customerList;
     Table customers;

变量“customerList”其实不是个list。它是一个普通的array(或客户集合)。除此之外,“theTable”是一个Table类型的对象(你可以用IDE容易的发现它的类型),“the”这个词是个不必要的干扰。

清楚的代码:

       Customer[] customers;
       Table customers;

3:命名要有合适的长度: 
  在高级编程语言中,变量名的长度通常不太限制。变量名几乎可以任何长度。虽然如此,这也可能使代码变得闹心。 
   
  不好的代码:

     var theCustomersListWithAllCustomersIncludedWithoutFilter;
     var list;

好的名称应该只含有必要的词汇来表达一个概念。任何不必要的字词都会使名称变长、难于理解。名称越短越好,前提是能在上下文中表达完整的意思(下订单这个场景中,“customersInOrder” 要比 “list” 好)。

清楚的代码:

       var allCustomers;
       var customersInOrder;

4:命名时编码规范保持一致,让规范帮助理解代码: 
  所有的编程技术(语言)都有自己的“风格”,叫做编码规范。程序员应该在写代码时遵循这些习惯,因为其他的程序员也知道这些,并按这种风格编写。下面我们看一个没有明显规范的不好的代码例子。下面的这段代码没有遵循很好的已知的“编码规范”(比如PascalCase, camelCase, Hungarian规范)。更糟糕的是,这有一个毫无意义的bool变量“change”。这是个动词(用来描述动作),但这里的bool值是来描述一个状态,所以,这里应该用一个形容词更合适。

不好的代码:

    const int maxcount = 1;
    bool change = true;
    public interface Repository;
    private string NAME;
    public class personaddress;
    void getallorders();

一段代码,只看它的一部分,你就应该直接明白它是什么类型,只需要看它的命名方法。

  例如:你看到了“_name”,你就能知道它是个私有变量。你应该在任何地方都利用这种表示方法,没有例外情况。

清楚的代码:

     const int MAXCOUNT = 1;
     bool isChanged = true;
     public interface IRepository;
     private string _name;
     public class PersonAddress;
     void GetAllOrders();

5:命名时相同的概念用相同的词表达 
  定义概念很难。在软件开发过程中,很多时间都花在分析业务场景、思考正确的定义里面所有的元素。这些概念永远都是让程序员头痛的事。

不好的代码:

     void LoadSingleData();
     void FetchDataFiltered();
     void GetAllData();
     void SetDataToView();
     void SetObjectValue(int value);

首先:

  代码的作者试图表达“get the data”的概念,他使用了多个词“load”,“getch”,“get”。一个概念只用一个词表达就行了(在同一个场景中)。

 “set”这个词用在了2个概念里:第一是“data loading to view”,第二个是“setting a value of object”。这是两个不同的概念,你应该使用不同的词。

清楚的代码:

     void GetSingleData();
     void GetDataFiltered();
     void GetAllData();
     void LoadDataToView();
     void SetObjectValue(int value);

6:命名时使用跟业务领域相关的词 
  程序员写的所有代码都是跟业务领域场景逻辑相连的。为了让所有关系到这个问题的人都能更好的理解,程序中应该使用在领域环境中有意义的名称。

不好的代码:

     public class EntitiesRelation{
          Entity o1;
          Entity o2;
     }

当在编写针对某个领域的代码时,你应该始终考虑使用领域有联系的名称。在将来,当另外一个人(不仅是程序员,也许是测试人员)接触你的代码时,他能轻松的理解这个业务领域里你的代码是什么意思(不需要业务逻辑知识)。你首先考虑的应该是业务问题,之后才是如何解决。

清楚的代码:

     public class ProductWithCategory{
        Entity product;
        Entity category;
      }

7:命名时使用在特定环境里有意义的词 
  代码里名称都有自己的上下文。上下文对于理解一个名称非常重要,因为它能提供额外的信息。让我们来看看一个典型的“地址”上下文:

不好的代码:

      String addressCity;
      String addressHomeNumber;
      String addressPostCode;

在大多数情况中,“Post Code”通常是地址的一部分,很显然,邮政编码不能单独使用(除非你是在开发一个专门处理邮编的应用)。所以,没有必要在“PostCode”的前面加上“address”。更重要的,所以的这些信息都有一个上下文容环境,一个命名空间,一个类。

  在面向对象编程中,这里应该用一个“Address”类来表达这个地址信息。

清楚的代码:

      String city;
      String homeNumber;
      String postCode;

命名方法总结: 
  概述起来,命名是来表达概念的

  1. 注意名称长度,名称里只该含有必要的词语
  2. 编码规范有助于理解代码,你应该使用它
  3. 名称不要混用
  4. 名称在业务领域里要有意义,在上下文里有意义

打赏
最近浏览
水光浮藻  LV6 2021年4月26日
小河码  LV1 2019年8月30日
miaoshi  LV16 2019年1月25日
多卡罗拉 2017年3月29日
暂无贡献等级
daqinhuangchao  LV9 2016年11月2日
hjb774970  LV12 2016年10月28日
190181458  LV2 2016年9月7日
SamChaw  LV4 2016年6月15日
czl  LV13 2016年5月20日
javahahayi  LV2 2016年4月28日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友