如何给程序中的变量起个好名字

新手程序员总是把大量的时间用在学习编程语言上,学习语法,技术和开发工具,他们认为如果掌握了这些就是一个优秀的程序员。但是,实际的编程不仅是要精通技术和工具,关键是要对某个特定领域的问题给出解决方案,而且通常要和其他程序员一起合作完成。因此,很重要的一点就是,程序员要用代码准确的表达出自己的思想,从而让其他人明白程序的含义。

编程大师Robert C. Martin在《Clean Code》中说道:“使用注释是为了弥补我们代码表意上的不足。”这句话就意味着如果你的代码需要添加注释,就说明你的代码还不够好。同时,这也说明如果不能在单纯的代码中展示你对问题或算法的理解是非常失败的,你只能依靠一些注释说明你的想法,而不能仅用代码显示。优秀的代码可以让人在没有注释的情况下看懂并理解,好的编程习惯也是让所有必要的信息都在代码中展示出来。

在编程理论中,有一个概念叫做“可以自我描述的源代码”,尤其是在那些有着较松的命名规则的环境下。引入这个概念,就是要增加代码的可读性,使代码更容易被维护和扩展。

下面我会对比一些“好的代码”和“不清晰的代码”。

命名时要展现你意图

如何在代码中命名一直是一个问题,一些程序员总是用简化,短小或编码后的名字,使得只有他们自己才能看懂。看一些例子:

不好的代码:int d; //elapsed time in daysint ds;int dsm;int faid;

名字中“d”可以表示任何东西,程序员只能用注释来表明他的意图,不能仅用代码显示。而“faid”很容易导致误解为ID。

清晰的代码:

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

避免会被误解的命名

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

不好的代码:Customer[] customerList;Table theTable;

变量“customerList”其实不是个list。它只是一个普通的数组(集合)。第二行中,“theTable”是一个Table类的对象,“the”这个词是个不必要的干扰。

清晰的代码:Customer[] customers;Table customers;

适合的名字长度

在现代的编程语言中,很长的变量名字是被允许的,你可以基本不受限制的去命名,但是这样会导致命名的混乱。

不好的代码:var  theCustomersListWithAllCustomersIncludedWithoutFiler;var  list;

好的名字应该包含足够的单词来表达意思,但是任何不必要的词都会使名字变长,变得难以理解。名称越短越好,前提是能在上下文中表达完整的意思。

清晰的代码:var allCustomers;var customersInOrder;

符合“代码规范”,可以更好的帮助理解

所有的编程语言都有自己的“风格”,叫做表示法。程序员应该写出符合这种表示法的代码,因为其他的程序员也知道这点,并按这种风格写程序。我们来看一个不符合表示法的不好的代码例子。下面的这段代码没有遵循任何代码标准(比如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();

一个概念不要用多种词表示,一个词也不要表示多种概念

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

不好的代码:

//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);

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

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

不好的代码:

public class EntitiesRelation

{
Entity o1;

Entity o2;

}

当你在编写针对某个领域的代码时,你应该使用领域背景相关的名字。如果以后有另外的人(不仅是程序员,也许是测试人员)接触你的代码时,他能轻松的理解你与背景相关的代码。所以,程序员首先应该考虑的是领域背景问题,之后才是如何得出解决方案。

清晰的代码:

public class ProductWithCategory

{
Entity product;

Entity category;

}

使用上下文环境下有意义的名字

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

不好的代码:

string addressCity;

string addressHomeNumber;

string addressPostCode;

在大多数情况中,“邮政编码”(PostCode)是地址的一部分,很显然,邮政编码不能单独使用(除非你是在开发一个专门处理邮编的应用)。所以,没有必要在“PostCode”的前面加上“address”。而且,所有的这些信息都应该有一个上下文环境,在面向对象编程中,这里应该用一个“Address”类来表达这个地址信息。

清晰的代码:

class Address

{

string city;

string homeNumber;

string postcode;

}

总结

总结一下,作为一名程序员,你应该:

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

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

3.符合“编码规范”,帮助理解;

4.一个概念不要多种名字混用;

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

时间: 2024-10-14 07:13:04

如何给程序中的变量起个好名字的相关文章

C++程序中不同变量、函数在内存中内存中的分布情况

一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结束时 可能 有系统收回.它与数据结构中的堆是两回事.分配方式类似于链表. 3.全局区(静态区):全局变量和静态变量是存储放在一块的,初始化的全局变量和静态变量在一个区域,未初始化的在相邻的另一个区域. 程序结束后由系统释放. 4.文字常量区:常量字符串就存放在这里.程序结束后有系统自动释放. 5.程

C# 程序中的变量

变量命名规则: 不能是c#关键字 由字母,数字,下划线构成 第一个不能是数字 不要超过31个字符 不能是函数名,类名 c#是大小写敏感的. 本质上,数据类型就是他存储方式和他参与运算的抽象. c#的数据类型分为两类: 值类型:int ,byte ,daouble,point ,size,dateTime (这个也是值类型) 引用类型: button,lable----. 这样的存储中,其实在本质上: 值类型的变量只是在栈中存储 而引用类型的变量在栈中存储着他的引用量,而他的本质是在堆中存储的 简

VC内联汇编,引用程序中的变量

[cpp] view plain copy print? int a=5; //变量a _asm { mov eax,a;       //将变量a的值放入寄存器eax add eax,eax;   //相当于a=a+a mov a,eax;      //将a+a的结果赋给a } //查看结果,注意a的初值为5 CString rst; rst.Format(_T("a=%d"),a); AfxMessageBox(rst);

【Java学习笔记之三】java中的变量和常量

变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表. 变量 变量代表程序的状态.程序通过改变变量的值来改变整个程序的状态,或者说得更大一些,也就是实现程序的功能逻辑.     为了方便的引用变量的值,在程序中需要为变量设定一个名称,这就是变量名.     由于Java语言是一种强类型

程序的砖瓦------变量与数据类型(06)

没有变量的程序不是程序,程序是由许许多多变量不停变化运行着的.在java中,程序中的变量可以简单理解为一块内存空间,用来存放字面值常量.java是一门强类型的语言,每个变量在使用前必须声明.声明就是在内存中开辟了一定的空间,不同的变量需要开辟的内存空间大小是不同的,为了规范这些不同的变量开辟的内存,java引入了数据类型的概念. java中,数据类型分为两类,一类是基本数据类型,是在简单程序中最常用的.另一类是引用类型,java中没有了C语言中的指针概念,与之类似的是引用.引用数据类型有类,数据

程序中的字符编码

每个程序员都经历过字符乱码的困扰,经过一通折腾后,总算显示正常,但之后似乎还是时不时碰到乱码的问题. 当我们打开notepad或者ultraedit后,这些工具都会自带编码转换的选项,里面各种字符编码格式十分复杂,往往一头雾水. 这里不谈具体编码格式问题,这是一个很学究的话题.其实对于软件开发而言,除非专门做字符编码相关的软件,否则我们一般遇到的最多的也就那么几种字符编码,如utf和gbk.这里要说的是,当我们要考虑字符编码时,理解一个基本的场景模型,然后根据这个模型,在遇到乱码问题后就可以定位

Python中的变量

1.在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线(_)的组合, 且不能用数字开头,比如:a = 1(变量a是一个整数).t_007 = 'T007'(变量t_007是一个字符串). 2.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且 可以是不同类型的变量,例如: a = 123              # a是整数 print a a = 'imooc'       # 变为了字符串 print a 3.Py

多线程程序中操作的原子性

[转]http://www.parallellabs.com/2010/04/15/atomic-operation-in-multithreaded-application/ 多线程程序中操作的原子性 0. 背景 原子操作就 是不可再分的操作.在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头.本文主要讨论了三 个问题:1. 多线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全

时间、金钱在java、数据库中的变量类型之总结

在编写程序时,总是有些变量的类型搞不很明白,现将目前涉及到的变量总结一下: 1.“时间”类型 (1).在数据库中的变量类型是:DateTime 比如: operateTime DATETIME,//数据库中编写的字段类型 (2).在java程序中的变量类型是:Date 比如: private Date operatetime;// 操作时间 //set.get方法 public Date getOperatetime() { return operatetime; } public void s