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

11 February 2015

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

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

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

更多内容:http://game-lab.org/posts/zoc-cleancode-2/

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 4661if (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_

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

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

转载于:https://www.cnblogs.com/mywolrd/p/4371597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

link的属性media的用处

<link rel”stylesheet” type”text/css” media”print” href”main.css” /> 就是样式输出的设备。 默认为 screen (缺省值)&#xff0c;提交到计算机屏幕&#xff1b;print&#xff0c; 输出到打印机&#xff1b;projection&#xff0c;提交到投影机&#xff1b;aur…

看了《隐秘的角落》才知道,掉头发有多可怕!10个掉头发最快的专业!快看看你中枪了没有!...

全世界只有3.14 % 的人关注了爆炸吧知识专业选得好秃头秃得早我爱学习&#xff0c;学习使我快乐我爱学习&#xff0c;学习使我进步我爱学习&#xff0c;学习使我美丽学习&#xff1a;我TM还能使你脱发呢我&#xff1a;港真现在上个大学不掉点头发都枉为一个真正的大学生上课与睡…

WPF企业内训全程实录(中)

摘要 WPF企业内训全程实录由于文章比较长&#xff0c;所以一共拆分成了三篇&#xff0c;上篇WPF企业内训全程实录&#xff08;上&#xff09;主 要讲了基础&#xff0c;这篇作为该实录的中篇&#xff0c;起着承上启下的作用,主要讲解开发模式、团队协作及应用框架。其实如果大家…

dakai微信小程序 ios_iOSAPP跳转微信小程序

前言APP跳转微信小程序&#xff0c;首先先关注一下微信官方给的一些资料&#xff1a;移动应用拉起小程序功能、iOS开发示例、iOS资源下载。准备工作准备工作需要在微信公众平台注册开发一个小程序、在微信开放平台注册申请一个APP&#xff0c;审核通过后方可使用&#xff0c;AP…

.Net Core with 微服务 - 可靠消息最终一致性分布式事务

前面我们讲了分布式事务的2PC、3PCTCC 的原理。这些事务其实都在尽力的模拟数据库的事务&#xff0c;我们可以简单的认为他们是一个同步行的事务。特别是 2PC,3PC 他们完全利用数据库的事务能力&#xff0c;在一阶段开始事务后不进提交会严重影响应用程序的并发性能。TCC 一阶段…

软件开发技术

1. 你们的项目组使用源代码管理工具了么&#xff1f;应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。 2. 你们的项目组使用缺陷管理系统了么&#xff1f;应该用。ClearQuest太复杂&#xff0c;我的推荐是BugZilla。 3. 你们的测试组还在用Wor…

[ JS 进阶 ] Repaint 、Reflow 的基本认识和优化 (2)

你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *&#xff0c;CSS选择器层叠不能超过三层&#xff0c;CSS尽量使用类选择器&#xff0c;书写HTML少使用table&#xff0c;结构要尽量简单-DOM树要小....等这些忠告&#xff0c;以前我就大概知道使用通配符或者CSS选择器层次过…

vgh电压高了有什么_智能变频电源的功能是什么?

所谓的智能变频电源&#xff0c;其主要功能是将我国的城市电源(220V直流)转换为世界上其他国家的设备(110V&#xff0c;60Hz)&#xff0c;可以说&#xff0c;它的功能是一台很好的稳压器和调频设备。智能变频电源的功能是什么&#xff1f;著名的美国北宇实验室研究报告指出&…

PDC Party 即将在东莞登场

各位社区精英们&#xff0c; 我们即将在东莞举办PDC Party的活动&#xff0c;本次活动除了精彩的PDC Keynote Demo视频分享与微软技术趋势的讨论之外&#xff0c;还希望能够借此机会&#xff0c;与各位微软技术社区精英们面对面的交流&#xff0c;共同讨论后续的发展&#xff0…

你们数学老师当年是怎么叫这些符号的…

全世界只有3.14 % 的人关注了爆炸吧知识你们数学老师都是怎么叫这些符号的呢&#xff1f;

lisp正负调换_坐标提取lisp程序

工程|标签&#xff1a;|字号大中小订阅;该程序主要用于CAD点(point)三维坐标提取&#xff0c;并将数据输出为CASS软件中使用的数据格式;输出格式&#xff1a;点号,,测量Y值&#xff0c;测量X值&#xff0c;测量Z值例&#xff1a;1,,100.3244,1232,433,25;2010-05-17;命令&#…

自主生态再进一步,龙芯中科完成.NET3.1-LoongArch64平台研发

近日&#xff0c;龙芯中科.NET团队完成了.NET3.1-LoongArch64平台研发工作&#xff0c;研发的成功标志着围绕龙芯自主指令系统LoongArch的生态建设成果再进一步。龙芯自主指令系统LoongArch基于龙芯二十年的CPU研制和生态建设积累&#xff0c;LoongArch从顶层架构&#xff0c;到…

keras 自定义层input_从4个方面介绍Keras和Pytorch,并给你选择其中一个学习库的理由...

全文共3376字&#xff0c;预计学习时长7分钟对许多科学家、工程师和开发人员而言&#xff0c;TensorFlow是他们的第一个深度学习框架。TensorFlow 1.0于2017年2月发布&#xff1b;但客观来说&#xff0c;它对用户不是非常友好。过去几年里&#xff0c;由于Keras和PyTorch比Tens…

KlayGE 4.0中Deferred Rendering的改进(五)完结篇:Post process

转载请注明出处为KlayGE游戏引擎上一篇分析了KlayGE中实现实时全动态GI的方法&#xff0c;本篇是这个系列的完结篇&#xff0c;主要讲流水线的最后一段&#xff1a;Post process。 Post process 在KlayGE 4.0的Deferred Rendering中&#xff0c;post process主要有HDR、AA和col…

Centos 手工创建新用户

当我们要创建一个用户时&#xff0c;通常使用useradd命令就可以自动创建了一个用户&#xff1b;实际上&#xff0c;在linux下&#xff0c;一切皆文件&#xff0c;设置好几个文件&#xff0c;也是可以创建出一个用户&#xff1a;文件如下&#xff1a;/etc/passwd :用户/etc/sha…

为了这个羞羞的项目,我差点成为“鉴黄师”

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;大数据文摘编译&#xff1a;蒋宝尚、魏子敏给男同学们一个机器学习&#xff0c;他们能研究所有他们能想到的问题。当然&#xff0c;根据这本真实存在的畅销书&#xff0c;他们真的能想到的话题也不多????开个玩笑&am…

android管理activity顺序,android activity 六个主要函数以及一些调用顺序

Android中一个Activity一般都需要实现六个函数:onCreate(), onStart(), onResume(),onPause(),onStop(),onDestroy().onCreate函数:注册你要用到的变量&#xff0c;比如说service&#xff0c;receiver&#xff0c;这些变量是无论你的Activity是在前台还是在后台都能够被响应到的…

qt绘制一圈圆_Qt绘制圆形,矩形等图形   绘制同心圆

原来Qt也可以绘制图形啊。利用QPainter类来绘制&#xff0c;再辅以其他类&#xff0c;诸如QPen来说明绘制的画笔&#xff0c;QPoint来说明某个点&#xff0c;QPaletee来说明绘制的颜料等等。在QWidget类中来实现虚拟函数oidpaintEvent(QPaintEvent*)。当调用这个QWidget时&…

到成都去是联想的必然选择

“孔雀东南飞&#xff0c;联想西南飞。” 成都一直是笔者最喜欢的城市之一。它又名“蓉”、“锦城”、“锦官城”和“天府之国”。虽然位于中国的中西部&#xff0c;但是科技水平、电脑技术应用和互联网普及水平却远远高于周边地区&#xff0c;经济水平也位列西部各城市首位。再…

【.NET】实现CI/CD(二)运行镜像,自动化部署

&#xff08;一重山&#xff0c;两重山。&#xff09;书接上文&#xff0c;在上回中我们说到了《【Azure Core】实现CI/CD&#xff08;一&#xff09;构建镜像并推送仓库今天我们继续往下说&#xff0c;说下CD&#xff08;持续部署&#xff09;的流程&#xff0c;也是很简单。…