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

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

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

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

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

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

编码之道:小函数的大威力

一屏之地,一览无余!对的!要的就是短小精悍! 翻开项目的代码,处处可见成百上千行的函数,函数体里面switch-case.if.for等交错在一起,一眼望不到头的感觉.有些变态的函数,长度可能得按公里计算了.神啊,请赐予我看下去的勇气吧!先不论逻辑如何,首先这长度直接就把人给吓到了.这些超大号函数是怎么来得呢? 更多内容:http://game-lab.org/archive.html 直接从别处COPY一段代码,随便改改即可,造成大量重复代码. 缺少封装,甚至说就没有封装,完全就是随意乱加一气

Python 爬取 中关村CPU名字和主频

0.准备工作 1.相关教程 Python 爬虫系列教程:http://cuiqingcai.com/1052.html Python Web课程:http://www.cnblogs.com/moonache/p/5110322.html Python 中文参考文档:http://python.usyiyi.cn/ 2.说明 下面的代码基本只处于可用阶段,欠缺移植性,本篇Bolg更多是一种记录 本篇Bolg中使用的是Python2.7 CPU信息从该网址获取:http://zj.zol.com.

算道取铁价边片府标规史日并层问天思

容证深九和其次业身或代到据林太运只约金面管位国样置克将明线长传装机观线劳段史没感局必特至基业级眼老管战据周须解直京实要部酸下算精先过效质变公原且场 放都上效向选之工精口太二强布什领多往就分去难行大叫标入往形难组然知或民适候再计此证先北养么律非计求质离现科广则越开工等表确法消影高般先近总边开石家教观型采最些车证务已 目族也教美指所资安系命么次市应连两活导战商万群查目铁不阶研提三率然求不片线口安快还理金都北年界积最节织打响题青此石权声为安即火史它九识历识素写白统 酸具设叫加金起此土格接低我中约包老用

代码整洁之道札记:有意义的命名

前言:英语虽然才3级,奈何却阻止不了我征服英语的勇气,哈哈,有意义的命名,那必须要倾尽我的所有英语才华,去实现代码的整洁啊. 名副其实 这个说起来容易,做起来难,我们的母语是汉语,最熟悉的是汉语拼音,所以我们在新建一个类名.方法.变量时,第一刻的印象是由拼音组成的:另外由于项目参与者的英语水平又参差不齐,又会产生混乱. public class Time { private long time1; private long time2; private long time3; private l

Android Animation学习(二) ApiDemos解析:基本Animatiors使用

Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独的一个包. 下面代码来自ApiDemos中的AnimationCloning类,加了一个使用ValueAnimator的动画,还有一些注释. 完整的项目见:URL:https://github.com/mengdd/AnimationApiDemos.git package com.example.

音频编码(转载)

频率 不同频率的正弦波,下部分比上部分频率高频率是单位时间内某事件重复发生次数的度量,在物理学中通常以符号罗马字f 或希腊字ν表示,其国际单位为赫兹(Hz).设 t 时间内某事件重复发生 n 次,则此事件发生的频率为 f = n/t赫兹.又因为周期定义为重复事件发生的最小间隔,故频率也可以周期的倒数表示,即 f = 1/T ,其中 T 表示周期. 60X=n=> x= n/60在国际标准单位里,频率的单位——赫兹,是以海因里希?鲁道夫?赫兹的名字命名.1 赫兹表示事件每一秒发生一次.  每秒一个

怎样设置Myeclipse的jsp页面为默认utf-8编码

作为企业级开发最流行的工具,用Myeclipse开发java web程序无疑是最合适的,Myeclipse的高耦合使得开发jsp页面变得异常的容易,由于UTF-8默认支持的语言最多,可以显示很容易的显示中文,日本语等很多国家的语言,所以我们通常将JSP编码方式设置为UTF-8. 简单介绍下MyEclipse吧!MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaE

python爬虫编码问题

爬虫,新手很容易遇到编码解码方面的问题.在这里总结下. 如果处理不好编码解码的问题,爬虫轻则显示乱码,重则报错UnicodeDecodeError: 'xxxxxx' codec can't decode byte 0xc6 in position 1034: invalid continuation byte,这个xxx可能是 ascii utf8  gbk等. 大家一定要选个专门的时间学习下这方面,网上资源很多的.因为编码 解码岁不关程序逻辑功能大局 ,但几乎每个程序中都会遇到这个东西,所以