`
天梯梦
  • 浏览: 13742033 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

 
阅读更多

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

我们在项目开发中,接触到的变量、函数、类多数都是项目自己定义的,往往都是为了解决一些特定的领域的问题,引入了各种各样的概念,代码里面的名字 就对应着问题领域或方案领域的这些概念,所以,对于一个命名良好,代码规范,设计简洁的系统,要想非常快的理解一个系统,最直接的方式就是 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. 原则:避免使用编码"

  • 匈牙利标记法:
    • Windows API时代留下的玩意
    • 形如:wdXX, dwXXX, strXXX
    • 类型变换导致名不副实,就有可能出现明明是个DWORD,变量名却是qwNum

PS.匈牙利命名对于我们这些在Linux下摸爬滚打的好多年的来说,看着真心别扭。

  • 成员前缀:
    • 形如:m_name, m_xxx
    • 基本上都无视,为何要多次一举

PS.说到这一点,可能有些同学有不同意见了,“我这样写是为了区分成员变量和临时变量啊!”,好像这样写也没什么大不了,遵循代码规范即可。如Google的C++代码规范,私有变量形如:xxx_,加后缀_,其目的除了让你知道这货是个私有变量,还有一点就是防止有些人图省事把带私有变量直接public掉,因为谁也不喜欢在代码里面看到大量这些带把的玩意。

  • 接口和实现:
    • 接口名形如:IXXX, I-接口修饰前缀
    • 类名形如:CXXX, C-类修饰前缀
    • 这些修饰多数时候都是废话

 

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

  • 使用解决方案领域名称:

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

  • 使用问题领域的名称

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

 

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

  • 良好命名的类、函数、名称空间来放置名称,给读者提供语境
  • 只有两三个变量,给名称前加前缀
  • 事不过三,变量超过三个考虑封装成概念,添加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://game-lab.org/posts/zoc-cleancode-2/

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

 

 

 

 

 

分享到:
评论

相关推荐

    深度学习算法的自动编码解码器Python程序

    在实际应用中,数据预处理是至关重要的,因为深度学习模型的性能很大程度上取决于输入数据的质量。Pandas可以帮助我们处理缺失值、异常值,以及将非数值数据转化为模型可接受的格式。此外,它还能方便地将数据集划分...

    用Python从《诗经》中取平仄相对的名字所用的 数据文件

    在当今社会,人们有时会从《诗经》中寻找灵感,为孩子或者项目取富有文化内涵的名字。本项目利用Python编程语言,从《诗经》的数据中提取平仄相对的词汇,以创建和谐、有意境的名字。 平仄是古代汉语诗词中的音韵...

    易语言取本机网卡名称

    在易语言中,“取本机网卡名称”是一个常见的功能,它涉及到网络通信和系统信息获取的知识点。 首先,我们要了解“取本机网卡名称”的含义。在计算机网络中,网卡(Network Interface Card,NIC)是硬件设备,负责...

    汉字的计算机编码音码-型码-音型码-流水码PPT优秀资料.ppt

    - 字根的确定:130种左右的字根,每个字根对应键盘上的一个编码字符。 - 键名字:具有代表性的字根在键盘上重复四次,如“禾”的编码为“tttt”。 - 字根分配:按第一笔划进行分区,如“大、土”分在第一区;第二...

    Google对外发布C++编码规范

    - **Function Overloading**:函数重载允许使用相同的名字定义多个函数,只要它们的参数列表不同即可。 - **Default Arguments**:默认参数值可以简化函数调用,但应避免过度使用,以免造成混淆。 - **Variable-...

    网页开发取色工具

    网页开发中的颜色选取是设计和编码过程中的重要环节,它涉及到视觉效果、用户体验以及品牌识别度等多个方面。"网页开发取色工具"是一款专为此目的设计的软件,它提供了高效且直观的方式,帮助开发者和设计师从屏幕上...

    BCHcodeECC.zip_BCH编码 ECC_bch_quietk9g_纠删码

    BCH编码以其创始人Bose、Ray-Chaudhuri和Hocquenghem的名字命名,具有高效的错误纠正能力,尤其在纠正单个或多个突发错误时表现出色。 **一、BCH编码基础** 1. **定义与原理**:BCH编码是一种基于伽罗华域上的...

    random-names:只是随机的名字

    可能使用到的有数组、链表、集合(如ArrayList或HashSet)等,具体取决于是否需要保持名字的唯一性或排序。 5. **算法**:在生成随机名字时,可能会用到一些算法,比如: - **Fisher-Yates洗牌算法**:如果需要从...

    java编码规范

    - **说明**:使用英文命名能够帮助程序员更好地理解和沟通,尤其是当项目涉及多国语言环境时,这尤为重要。此外,即使是纯拼音命名也应避免。 - **反例**:`DaZhePromotion`, `getPingfenByName()`, `int某变量=...

    linux常用命令学习日志

    Linux 命令学习日志 Linux 命令是 Linux 操作系统中的一系列命令,用于管理和维护系统。这些命令可以在 Shell ...这些知识点是 Linux 命令学习日志中的重要部分,掌握这些命令可以帮助您更好地管理和维护 Linux 系统。

    《办公自动化简明教程(Office+2007版)》第2章.ppt

    - 词组的编码与输入:双字词、三字词、四字词和多字词的编码遵循特定规则,通常取每个字的字根首码组合。 - 重码处理:当出现重码字时,可以通过输入下一个字或使用数字键选择正确的位置。 熟练掌握键盘操作和各种...

    java代码重构经验分享

    2. 过长函数:重构成 small method 后要能取个好名字。 3. 过大类:分开,提炼时应该选择 class 内彼此相关的变量,将他们放在一起。 4. 过长参数列:改成传对象,谨慎。 5. 发散式变化:当你看着一个 class 说:o,...

    cnv_encd.rar_convolutional

    在IT领域,卷积编码(Convolutional Encoder)是一种广泛...总之,卷积编码是信息论和通信工程中的一个重要概念,通过C++实现的cnv_encd.cpp文件提供了将理论转化为实际应用的桥梁,帮助我们构建高效且可靠的编码系统。

    总线技术 数传_检纠_卷积码.docx

    卷积码是数字通信和数据存储领域中一种重要的纠错编码技术,它在计算机科学和电子通信工程中占有重要地位。这种编码方式通过连续的输入序列产生一个更长的输出序列,其中包含了纠错信息,能够在数据传输或存储过程中...

    在其他高校图书馆中的应用实例.docx

    - **三个字的责任者**:取第一个字的左右上角,第二、第三个字各取左上角。 - **两个字的责任者**:分别取两字的左右上角。 - **单个字的责任者**:先取上方左右角,再取下方左右角。 - **集体责任者或复姓责任者**...

    五笔考试题详解.doc

    2. **单笔画键**:每个五笔字根键盘的字母键上除了一个键名字根外,还包含其他类型的字根,其中有些字根本身就是汉字,称为单笔画键。 3. **字根的区号与笔划代码**:字根所在的区号通常与其第一笔划的代码相同,...

    天狼星*算码器

    这个软件的名字取自于天文学中的天狼星,寓意着它如同那颗最亮的星星,照亮了我们在数字世界中探索的道路。 算码器,顾名思义,是一种用于处理和解码特定编码格式的软件工具。在我们的日常生活中,无论是通信、数据...

    yfz_getIdentifier.zip

    同时,我们也会讨论如何动态获取`R.string`的值,这是资源管理中的一个重要概念。 1. **获取控件ID**: 在Android中,每个UI控件都有一个唯一的ID,它是在XML布局文件中定义的。例如,对于一个TextView,我们可能...

Global site tag (gtag.js) - Google Analytics