编码之道:取个好名字很重要(转)

 

代码就是程序员的孩子,给“孩子”取个好听的名字很重要!

  我们在项目开发中,接触到的变量、函数、类多数都是项目自己定义的,往往都是为了解决一些特定的领域的问题,引入了各种各样的概念,代码里面的名字就对应着问题领域或方案领域的这些概念。所以,对于一个命名良好、代码规范、设计简洁的系统,要想非常快的理解一个系统,最直接的方式就是RTFC(Read The Fucking Code)。对于一个不断演进的系统,代码的可读性至关重要,首要要解决的问题就是名字,变量名、函数名、类名等都需要仔细斟酌,认真对待,一个能够简洁,能够清晰表达概念和意图的名字就显得尤为重要。

  阅读《代码整洁之道》这本书后发现其中说的内容在我们自己项目中比比皆是,随便拿出一块代码都可以当做反面教材给大家讲半天。长时间积累,导致代码发霉变质,取名也是毫无章法,信手拈来。阅读这样的代码,撞南墙的心都有了。下面结合自己项目中的问题和《代码整洁之道》谈谈关于命名相关的原则。

  1. 原则:名副其实

  • 选名字是件严肃的事情,选个好名字很重要。
  • 如果名字需要注释来补充,那就不是个好名字。
  • 最重要的是要名副其实,名字能表达出概念和意图。

  BAD:

int t = currentTime.elapse(e); // 消逝的时间,以毫秒计
...
if (t > timeout_value)
{
   Zebra::logger->debug("---一次循环用时 %u 毫秒-----", t);
}
GOOD:
int elapsed_ms = currentTime.elapse(e);
...
if (elapsed_ms > timeout_value)
{
   Zebra::logger->debug("-----一次循环用时 %u 毫秒---", elapsed_ms);
}
2. 原则:避免误导
  • 必须避免留下掩藏代码本意的错误线索
  • 避免使用与本意相悖的词
  • 提防使用不同之处较小的名称
  • 拼写前后不一致就是误导

  BAD:

std::vector<int> account_list; // _list就是一个误导, accounts会更好
bool sendToZoneServer(); // 和下面的函数差别很小
bool sendToZoneServers(); // sendToAllZoneServers会好点

  3. 原则:做有意义的区分

  • 代码是写给人看的,仅仅是满足编译器的要求,就会引起混乱。
  • 以数字系列命名(a1,a2,...),纯属误导。
  • 无意义的废话: a, an, the, Info, Data

  BAD:

void copy(char a1[], char a2[]) {
  for (size_t i = 0; a1[i] != '\0'; i++)
     a2[i] = a1[i];
}

  GOOD:

void copy(char source[], char dest[]) {
  for (size_t i = 0; source[i] != '\0'; i++)
     dest[i] = source[i];
}

  4. 原则:使用可读的名字

  • 避免过度使用缩写
  • 可读的名字交流方便

  猜一猜下面的类是干什么的?和别人怎么说这几个类?

  根据这些简直变态的缩写,如果没有注释基本上很难知道是干什么的,当你和别人交流的时候,你就不得不一个一个字母来念“X-L-Q-Y”、“L-T-Q Manager”,鬼知道你说的是什么?PS. XLQY-XianLvQiYuan(仙履奇缘), LTQ-LiaoTianQun(聊天群),有这样的名字也是醉了。

  BAD:

class XLQY;
class FCNV;
class LTQManager;

  5. 原则:使用可搜索的名字

  • 避免使用Magic Number
  • 避免使用单字母,或出现频率极高的短字母组合(注意度的把握)。

  BAD:

if (obj->base->id == 4661) // 4661是啥玩意?
{
   usetype = Cmd::XXXXXXX;
}
int e; // 怎么查找?
XXXX:iterator it; // 变量作用的范围比较大的时候,也不见得是个好名字

  GOOD:

#define OJBECT_FEEDBACK_CARD 4661
if (OJBECT_FEEDBACK_CARD == obj->base->id)
{
   usetype = Cmd::XXXXXXX;
}

  6. 原则:名字尽量来自解决方案领域或问题领域

  • 使用解决方案领域名称

  写代码的同学多数都是都出自CS,术语、算法名、模式名、数学术语尽管用。如AccountVisitor:Visitor模式实现的Account类。

  • 使用问题领域的名称

  我们代码里面多数都是这些名称,不明白找策划问问,基本上都是功能相关的名称。

  7. 原则:适当使用有意义的语境

  • 良好命名的类、函数、名称空间来放置名称,给读者提供语境。
  • 只有两三个变量,给名称前加前缀。
  • 事不过三,变量超过三个考虑封装成概念,添加struct或class。

  BAD:

// 看着整齐?使用方便?
DWORD love_ensure_type_;  //当前的爱情保险类型
DWORD love_ensure_ret_; //购买爱情保险回应标示
DWORD love_ensure_total_; //现在已经盖章数目
DWORD love_ensure_..._;  //...
DWORD love_ensure_..._;  //...

  最后:我们的C++命名规范

  • 文件名:

    • 首字母大写,多个词组合起来
    • 如: SceneUser.h, Sept.h
  • 类名/名称空间名:
    • 首字母大写,多个词组合起来
    • 使用名词或名词词组
    • 避免使用C前缀,如: CSept
    • 如: SceneUser, SeptWar
  • 函数名:
    • 首字母小写
    • 使用动词或动词词组
    • 避免使用孤立的全局函数,可以封装在类或名称空间里面
    • get, set, is前缀的使用
    • 如: fuckYou(), levelup()
  • 变量名:
    • 全部字母小写,多个词以下划线分隔。
    • 私有成员变量加后缀_,公有变量不用。
    • 避免使用孤立的全局变量,可以封装在类或名称空间里面。
    • 如: quest_id, questid_

  取名是一件严肃的事情,我们需要认真对待,名字代表着一个个概念,名字代表着你想表达的意图,好名字是可读代码的首要条件:

  • 写下任何一行代码的时候,心里都要想着自己的代码是给别人看的。
  • 为函数、变量、类取个好名字,遵循规范和原则。
  • 见到不符合规范和原则的名字,确毫不留情的干掉它,特别是功能性的代码。

http://kb.cnblogs.com/page/517741/

时间: 2024-09-17 03:50:28

编码之道:取个好名字很重要(转)的相关文章

编码之道:取个好名字很重要

代码就是程序员的孩子,给"孩子"取个好听的名字很重要! 我们在项目开发中,接触到的变量.函数.类多数都是项目自己定义的,往往都是为了解决一些特定的领域的问题,引入了各种各样的概念,代码里面的名字 就对应着问题领域或方案领域的这些概念,所以,对于一个命名良好,代码规范,设计简洁的系统,要想非常快的理解一个系统,最直接的方式就是 RTFC(Read The Fucking Code).对于一个不断演进的系统,代码的可读性至关重要,首要要解决的问题就是名字,变量名.函数名.类名等都需要仔细斟

程序员之痛点:取个好名字

在计算机科学中只有两件事情最难:缓存失效和取名字. --Phil Karlton 写出好代码很难,为什么?因为好的代码都是易读的.我们总是关注于当下,却不顾及以后:我们总是关注于代码一次写成,但忽视了在以后会被一次又一次地读写. 好代码总是为了方便他人易读在不断优化,这就需要我们将共情作为核心.好代码能帮助别人从读到的一段文字里面去回溯,从其他不同的视角去观察这个问题,这甚至比写代码本身还难:程序员需要去理解这段代码解决了一个人类问题,并且用一个其他人都能明白的方法表达出来.对于我来说,这就是将

网络推广中博客的名字很重要

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 一个成功的博客,不仅拥有好的内容,还要有一个足够吸引眼球的名字. 博客名称尽可能做到简洁明了,博客名称如果太长会导致别人无法快速记下你的博客名,这将直接影响博客的回访数量.一般情况下,博客含有二个标题,正标题和副标题,名称太长了容易让人遗忘副标题,,而且博客名称过长对自己博客的美观也会存在一定影响.我个人尤其钟爱简短的博客名,这样便于记住.

对象-我为了省事直接充别的项目复制的事件代码,给我项目的控件取了相同名字,然而运行后没效果. 如

问题描述 我为了省事直接充别的项目复制的事件代码,给我项目的控件取了相同名字,然而运行后没效果. 如 我为了省事直接充别的项目复制的事件代码,给我项目的控件取了相同名字,然而运行后没效果. 如 private void rdbRS232_CheckedChanged(object sender, EventArgs e) { if (rdbRS232.Checked) { gbRS232.Enabled = true; btnDisconnectRs232.Enabled = false; }

云的生活有点晕:名字很性感 技术并不新

好几年前,就知道互联网有个听起来悬之又悬的"云概念".那时给人感觉就像天上的云彩一样,看起来很美好,可似乎离普通人太远,怎么够也够不着. 可是不知从什么时候开始,身边的云产品越来越多,云音乐.云电视.云报纸.云笔记.云手机.云支付.云盘--什么东西都跟云沾上了边.云山雾罩之间,不禁让人有些发晕.什么时候云技术和我们的日常生活也联系得如此紧密了?这些五花八门的云产品又会给人们的生活带来哪些便利? 名字很性感,技术并不新 云计算最早由Google公司提出,在2007年开始大红大紫.这种技术

编码-htmlparser抓取url的时候,含有中文字符抛出异常

问题描述 htmlparser抓取url的时候,含有中文字符抛出异常 我明确的看了网站的编码是gb2312,并且有设置 parser.setEncoding("gb2312"); 但是最后抛出这个异常 Exception in thread "main" java.lang.IllegalArgumentException 原因是我的url里面含有中文,不知道该怎么结局诶 解决方案 这个可能是htmlparser的弊端吧!还有好几种比较不错的解析html,比如Jso

编码-php上传一个中文名字的图片能显示出来也能存进数据库但数据库中名字是问号,不知怎么改是好麻烦大家了!

问题描述 php上传一个中文名字的图片能显示出来也能存进数据库但数据库中名字是问号,不知怎么改是好麻烦大家了! php中编码为:header('content-type:text/html;charset=gbk');php中加了此句:mysqli_query($dbcset names 'gbk'"");php脚本编码格式为:ANSI数据库链接校对为:gbk_general_cimysql字符集:utf8我用此句:set names 'gbk' 将其改为'gbk' 解决方案 把PHP

13万皇朝家私一个月裂10道缝想要退货很难

"花了13万多买的'皇朝家私'品牌实木家具,还没等用就裂开了缝儿,最大的缝都透光见亮了,足有5到6毫米!"家住和平区三好街汇景新世界的刘女士讲起她购买"皇朝"家具的遭遇时,激动而又气愤."就是因为相信这是个大品牌,所以新房三个卧室,一个客厅和一个餐厅,所有家具都是皇朝家私,10多件家具,都是裂纹."刘女士跟厂家沟通,厂家只同意更换,退货提出要包装费,而且根本也不可能给退."10多道裂纹,都能透光了!"2011年8月30日,刘女

乐高:赤马传奇 名字很长的免费竞速游戏

乐高:赤马传奇(LEGO® Legends of Chima: Speedorz)>(免费)是一款竞速游戏,由华纳兄弟影业出品,本作虽然挂着乐高的名字,但其实是华纳兄弟影业的自有品牌Chima.在Chima王国里,游戏角色需要通过竞速来为自己取得荣耀,赢得部落奖杯.而且用来竞速的工具不再是寻常见到的汽车一类的道具,而是名叫Speedorz的工具.你 的角色需要驾驶Speedorz沿着固定的轨迹进行比赛,在竞速的过程中还要注意躲避障碍物,并且拾取乐高积木.你的比赛时间和拾取到的乐高积木将会帮助 你