阅读更多

12顶
0踩

研发管理


编程初学者总是把大量的时间用在学习编程语言、语法、技巧和编程工具的使用上。他们认为,如果掌握了这些技术技巧,他们就能成为不错的程序员。然而,计算机编程的目的并不是关于精通这些技术、工具的,它是关于针对特定领域里的特定问题创造出相应的解决方案,程序员通过相互合作来实现这些。所以,很重要的一点,你需要能精确的用代码表达出你的思想,让其他人通过代码能明白你的意图。

让我们先看看编程大师Robert C. Martin的杰作《Clean Code》里的一句话:
引用
注释的目的是为了弥补代码自身在表达上的不足。

这句话可以简单的理解为如果你的代码需要注释,最有可能是你的代码写的很烂。同样,如果在没有注释的情况下你无法用代码完整的表达你对一个问题或一个算法的思路,那这就是一个失败的信号。最终,这意味着你需要用注释来阐明一部分的思想,而这部分在代码里是看不出来的。好的代码能够让任何人在不需要任何注释的情况下看懂。好的编码风格能将所有有助于理解这个问题的所有信息都蕴含在代码里。

在编程理论中,有一个概念叫做“自我描述的源代码”。对于一段代码,一种常见的自我描述机制是遵循某种非严格定义的变量、方法、对象命名规则。这样做的主要作用就是使源代码更易读易懂。所以,也就更容易维护和扩展。

这篇文章里,我将举出一些例子,说明什么是“不好的代码”,什么是“清楚的代码”

命名要能揭示意图

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

不好的代码:

int d;
// 天数
int ds;
int dsm;
int faid;


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

清楚的代码:

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


命名时避免含义引起误解的信息

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

不好的代码:

Customer[] customerList;
Table theTable;


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

清楚的代码:

Customer[] customers;
Table customers;


命名要有合适的长度

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

不好的代码:

var theCustomersListWithAllCustomersIncludedWithoutFilter;
var list;


好的名称应该只含有必要的词汇来表达一个概念。任何不必要的字词都会使名称变长、难于理解。名称越短越好,前提是能在上下文中表达完整的意思(下订单这个场景中,“customersInOrder” 要比 “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 GetAllData()
//2.
void SetDataToView();
void SetObjectValue(int value)

  • 首先:代码的作者试图表达“get the data”的概念,他使用了多个词“load”,“getch”,“get”。一个概念只用一个词表达就行了(在同一个场景中)。
  • 第二:“set”这个词用在了2个概念里:第一是“data loading to view”,第二个是“setting a value of object”。这是两个不同的概念,你应该使用不同的词。
清楚的代码:

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


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

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

清楚的代码:

class Address
{
string city;
string homeNumber;
string postCode;
}


命名方法总结

概述起来,做为一个程序员,你应该:

  • 命名是来表达概念的
  • 注意名称长度,名称里只该含有必要的词语
  • 编码规范有助于理解代码,你应该使用它
  • 名称不要混用
  • 名称在业务领域里要有意义,在上下文里有意义
请随便发表你的意见。如果你知道在命名或代码表达方面的其它问题,请写在下面的评论里。

英文原文:Express names in code: Bad vs Clean / 译:外刊IT评论
来自: 外刊IT评论
12
0
评论 共 9 条 请登录后发表评论
9 楼 真爱无敌 2013-07-22 16:10
有时候注释是必需的,但是好的代码更为重要
8 楼 小鱼不爱水 2013-06-14 08:58
var theCustomersListWithAllCustomersIncludedWithoutFilter; 
var list; 

这个人是有多无聊?
7 楼 a123159521 2013-06-09 09:32
这种规范不就是我写的代码吗?
6 楼 raph_java 2013-06-08 16:20
没注释的代码是不被允许的
5 楼 luliruj 2013-06-08 09:47
dsjt 写道
int elapsedTimeInDays; 
int daysSinceCreation; 
int daysSinceModification; 
int fileAgeInDays;


这种长命名 很蛋疼

最起码比a1,a2,a3这种命名好,不然维护起来不知道有多蛋疼
4 楼 sanshizi 2013-06-08 09:45
如果你的代码需要注释,最有可能是你的代码写的很烂

对简单的业务可以, 复杂的, 注释还是不可少的,

好的命名 + 注释, 都不可少

但是修改程序时不要忘了修改相应的注释 !!
3 楼 yixiandave 2013-06-08 09:32
dsjt 写道
int elapsedTimeInDays; 
int daysSinceCreation; 
int daysSinceModification; 
int fileAgeInDays;


这种长命名 很蛋疼

还好,能看懂意思就行。现在的ide辅助很完善了,长命名不会增加太多写代码的负担
2 楼 lihao312 2013-06-08 09:31
变量命名的确是很重要的, 好的开发习惯, 便于后来人维护的
1 楼 dsjt 2013-06-08 09:00
int elapsedTimeInDays; 
int daysSinceCreation; 
int daysSinceModification; 
int fileAgeInDays;


这种长命名 很蛋疼

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • qiwsir#ITArticles#代码里的命名规则1

    代码里的命名规则:错误的和正确的对比编程初学者总是把大量的时间用在学习编程语言,语法,技巧和编程工具的使用上。所以,很重要的一点,你需要能精确的用代码表达出你的

  • 不良编程文化

    “这代码真垃圾”,当我们翻查一些代码寻找一个特别讨厌的bug时,同事大声这样说。“是吗”,我回答到。 像这样的谴责,以及其它一些类似的话,在办公室里经常会听到,而且频率在增加。而最令人不安的是,这代码并不是特别的糟糕。我这话是什么意思?不能把它们写 的更好吗?当然!大多数的代码都有改善的空间——只要有足够的时间和资源。垃圾代码确实有,我们都看得见,而且都是我们自己写的,但这并不是问题。

  • 文化编程

    莫看,莫看,莫看。重要的事说三遍,浪费时间我不管。 文化编程(Literate Programming)由计算机学界名宿 Donald Knuth 所创。其名,大陆译为「文学编程」,甚缪。将程序视为蛮夷,以文教化,Literate Programming 之意大抵如是。 文化,其目的在于实现人与人的沟通交流。倘若这世上只有一人,文化是多余...

  • “程序员文化”之正名

    “程序员文化”之正名 (本文首发于《中华读书报》8月6日号)熊节  我总是很愿意把“程序员”和“文化”这两个词组合在一起使用。不独是我,我相信每个程序员都希望有一种属于自己的文化。上至帝王将相,下至贩夫走卒,多年传统的职业分工和社会地位划分使这些人群都有属于自己的文化。但程序员(或者说,软件开发者),这个信息浪潮催生的新兴人群

  • 编程馆的文化

    邹式编程馆核心规定: 我们编程馆只用自己培养的人,非我们自己培养的人没有字辈; 培养的人按第n年届来称呼, 只有进入编程馆才有字辈和号; 离开后不收回字辈和号,但是如果员工在外做出违背公司章程的行为, 严重的需要由总部讨论决议,由总部收回字辈,逐出编程馆,改邪归正可以重新授予辈号; 导师可以给学徒授号, 但要报备总部, 否则不予认可. 字辈表 家屯蒙随 家: 企业内部团队精神要排在第一位,每成...

  • 谈编程语言

    作为开放源码促进会的领袖人物,埃里克·雷蒙德一直在商界努力为老一代的Unix的程序员和越来越多的Linux的拥护者之间搭建一座桥梁。而且他 的这一思想与他写的“新黑客字典”一书的内容不谋而合,该书1991年出版,主要谈到了因特网和黑客文化,至今仍具有浓厚的传奇色彩。最近埃里克·雷蒙德推出了他的一本新书“Unix编程的艺术”,书中涉及了编程文化的精华和使用Unix的一些思维过程。在近期为其新书做

  • 写代码时候的命名规则、命名规范、命名常用词汇

    避免滥用通用单词通用单词可以在很多场景下命名,但不能区分具体函数职责。当函数本身的实现途径不同时,难以从函数名得到足够的信息下面就列举几个例子动词用途示例Create创建实例,常用于实例化方法和工厂方法的...

  • python中的变量命名规则

    There are only two hard things in Computer Science: cache ...python中的变量命名规则1.变量命名2. 变量命名的描述性3.变量名尽量短,但是不要太短4.合理使用变量5. 变量定义尽量靠近使用6. 合理使用namedtuple/

  • [转]三种编程命名规则:驼峰命名法,帕斯卡命名法,匈牙利命名法

    目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。 驼峰命令法(Camel):  也称骆驼式命名法正如它的名称所表示的那样,是指混合使用大小写...

  • DB2错误代码大全

    DB2 错误代码大全 sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 01568 动态SQL语句用分号结束 +100 02000 没有...

  • 程序员的文化

    程序员的文化 零、 计数 程序员的计数是从零开始的,非程序员一般是从1开始计数的。从零开始计数的习惯 开始于机器语言和汇编语言的时代。为了方便计算偏移量,从零开始是合理的。C语言 继承了从零开始计数的历史传统。 一、helloworld 不管是哪个编程语言,首先举的编程示例一定是Hello world,这成了编程语言的举例子的潜规则。 非程序员听到helloworld 就只是一个helloworld,但是对于程序员来说,大家的第一个反应是 这就是编程语言的开门见山的例子了。 二、二进制 程序员在计算机

  • Python 语法错误:“SyntaxError: invalid character in identifier“,原因及解决方法

    错误翻译 语法错误:标识符中的无效字符。 报错信息 指着的位置有问题,报错了。 原因一:冒号后面有制表符。 原因二:或者第 3 行开头是制表符。 python 的缩进是 4 个空格,不能识别制表符。 注:跟中文英文空格...

  • 【新手必备】:高质量 代码命名规则

    本文与大家聊一聊编程中非常关键的一个点,如何更好的对代码命名。   一、引言   《代码整洁之道》这本书提出了一个观点:代码质量与其整洁度成正比,干净的代码,既在质量上可靠,也为后期维护、升级奠定了...

  • 代码的两种命名方法:驼峰命名、匈牙利命名(优缺点)

    代码的两种命名方法:驼峰命名、匈牙利命名(优缺点) 一、骆驼命名法:  小驼峰法(camel方法)变量一般用小驼峰法标识。  第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写...

  • python的命名规则_python命名规则

    1、模块模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)# 正确的模块名importdecoderimport html_parser # 不推荐的模块名import decoder-特殊的如init模块,如果模块是包...

  • 三种编程命名规则:驼峰命名法,帕斯卡命名法,匈牙利命名法

    目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。 驼峰命令法(Camel):  也称骆驼式命名法正如它的名称所表示的那样,是指混合使用大小写...

  • C语言编程规范 — 标识符的命名规则

    C语言编程规范—标识符的命名规则。

  • c++变量命名规则

    浅谈C++变量命名规则    匈牙利命名法的来历和介绍分类:C Plus Plus 匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象...

  • KW代码检查规则-RLK.JNDI

    kw规则介绍 RLK.JNDI

  • VB代码编写规则

    VB代码编写规则

Global site tag (gtag.js) - Google Analytics