链接:http://www.php100.com/html/dujia/2014/1017/7525.html
原文:https://blog.goyello.com/2013/05/17/express-names-in-code-bad-vs-clean/
新伎俩式员总是把大量的韶光用在学习编程措辞上,学习语法,技能和开拓工具,他们认为如果节制了这些便是一个精良的程序员。但是,实际的编程不仅是要精通技能和工具,关键是要对某个特定领域的问题给出办理方案,而且常日要和其他程序员一起互助完成。因此,很主要的一点便是,程序员要用代码准确的表达出自己的思想,从而让其他人明白程序的含义。

编程大师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.利用在背景领域和高下文中都故意义的名字。
另:51CTO"大众年夜众号长期招募专栏作者、技能文章翻译与精良文章稿件
投稿邮箱:liujia@51cto.com