如何高效编码? 使用有意义的命名

简介: 编码中随处可见命名。我们给变量、函数、参数、类和包命名;我们jar文件命名。我们命名,命名,不断命名,既然有怎么多命名要做,不妨就做好它。

编码中随处可见命名。我们给变量、函数、参数、类和包命名;我们jar文件命名。我们命名,命名,不断命名,既然有怎么多命名要做,不妨就做好它。


一、名副其实

名副其实说起来很简单,但我得强调,这很严肃。选个好名字要花时间,但是后面省下来的时间要比花掉得多。


注意命名,而且一旦发现有更好的命名,就换掉旧的。这么做,读你代码的人(包括你自己)都会更开心。


变量、方法、类的命名应该告诉你,它为什么存在,它做什么事,应该怎么用。


如果名称还需要用注释来说明,那就不算名副其实了。


比如下面几个


String s = ""; //要执行的SQL

名称s什么也没说明,为什么不改成String sql = "";呢


Date d; //开始时间

开始时间完全可以叫做startTime


List<Book> list = new ArrayList<>(); //返回的图书集合

它可以叫做books,说明这是一个存book的集合。或者叫做respList,表明他是要返回的集合。


二、避免误导

我们必须避免留下掩藏代码本意的错误线索,避免使用与本意相悖的词。


别用accountList来命名一组账号,除非它真的是List类型。如果它不是一个List类型,就会引起错误的判断,所以我们用accountGroup或者直接用accounts要更好一些。


我们还要提防使用跟其他命名很相似的名称,比如selectProjectForErrorsOfStringByName和selectProjectForNormalsOfStringByName,想区分这两个得花多长时间呢,这两个名字外形太相似了。


还有就是要避免0和O混用,1和l和I混用。


三、做有意义的区分

如果我们只是为满足编译器或IDE的需求而写代码,就会制造麻烦。例如,因为同一作用域内两个变量不能重名,你可能会随手改掉其中一个的名称。有时候干脆用错误的拼写充数,甚至直接在后面加个1。


废话是另一种没意义的区分,假如你有一个ProjectInfo类,又有一个ProjectData类。那这两个虽然名称不同,意思却没什么区别。


废话都是冗余,variable一词永远不应该出现在变量名中,table一词永远不应该出现在表名中。NameString会比Name好吗,难道Name会是一个浮点数?或者说有个名为Student类,又有一个StudentObject类,区别何在?


所以说,如果缺少明确约定,customerInfo与customer没区别,theMessage与message没区别。


四、使用读得出来的名称

有一个生成日期的方法,生成格式是年月日时分秒,叫做genymdhms。很明显这读不出来,除非你按你自己的理解来读,读出来了别人也不一定知道你说的是这个方法。


五、使用可搜索的名称

名称长短应该与其作用域大小相对应,若变量或常量可能在代码中多处使用,就应该赋予其便于搜索的名称。


比如一个只有一两行代码的for循环,就可以直接使用fori


如果是在代码中多处使用的变量或常量,就应该起一个容易发现的名称。这也是为什么常量推荐使用大写用下划线分隔。比如一个表示用户名称错误的字符串,USER_INPUT_ERROR肯定要比uie更容易发现一些。


六、类名使用名词,方法名使用动词

类名和对象名应该是名词或者名词短语,比如Customer、Student、Project、StudentInfo,但是避免使用Data、Info、Detail这样的类名。


方法名应该是动词或动词短语,比如save、findUsers、deletePage等。又或者Javabean里面的getset方法。


七、每个概念对应一个词

给每个概念选一个词,比且一以贯之。用同样的风格来给每个类中的同种方法命名。


比如同一个类中查找数据的方法,find和select和get和query有什么区别。


八、别用双关语

不要把同一单词用于不同目的,同一术语用于不同概念,基本就是双关语了。


比如,在多个类中都有add方法,该方法通过连接两个原值来获得新值。如果现在要写一个新类,类中有一个方法是把单个参数添加到一个集合中,这个方法应该也叫add吗?这样是跟原来的add方法保持一致了,但实际语义却不同。应该用append或者insert之类的来命名。


九、使用解决方案领域的名称

记住,只有程序员才会读你的代码。所以,尽管使用计算机领域的术语来命名。


如果你使用问题所涉及的领域来命名,难道下一个读你代码的人要去跑去问客户每个名称的含义吗?


程序员要做太多技术性的工作,取一个技术性的名称,通常是最靠谱的做法。


如果不能使用我们熟悉的术语来给手头的工作命名,就只能采用所涉问题领域来命名了。与所涉问题领域更贴近的代码,应当使用源自问题领域的名称。


最后,取好名字最难的地方在于需要良好的描述技术和共有文化背景。与其说这是一种技术或管理问题,还不如说是一种教学问题。结果是,这个领域内的许多人都没能学会做得很好。


多数时间我们并不会刻意去记类名和方法名,使用现代IDE都可以对付这些,好让自己集中精力于把代码写的就像词语篇章。


不妨试试上面这些规则,看你的代码可读性是否会有所提升


相关文章
|
关系型数据库 分布式数据库 对象存储
沉浸式学习PostgreSQL|PolarDB 5: 零售连锁、工厂等数字化率较低场景的数据分析
零售连锁, 制作业的工厂等场景中, 普遍数字化率较低, 通常存在这些问题: 数据离线, 例如每天盘点时上传, 未实现实时汇总到数据库中. 数据格式多, 例如excel, csv, txt, 甚至纸质手抄. 让我们一起来思考一下, 如何使用较少的投入实现数据汇总分析?
427 0
|
2月前
|
存储 弹性计算 运维
AI时代下阿里云基础设施的稳定性架构揭秘
计算、存储、网络作为云计算基础 IaaS 服务,一直是阿里云的核心产品,承载着百万客户的 IT 基础设施。曾经我们认为应用高可用、服务分布式可以满足客户对 IaaS 所有的稳定性诉求。
339 2
AI时代下阿里云基础设施的稳定性架构揭秘
|
安全 数据挖掘 Shell
SSH安全远程登录与端口转发
**SSH 概述**:SSH 是开发者必备工具,用于安全远程登录及文件传输。本文聚焦SSH的两大功能:**密钥登录**和**端口转发**。
300 0
|
7月前
|
数据采集 边缘计算 缓存
|
8月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
409 30
|
9月前
|
人工智能 安全 Linux
阿里云与龙蜥携手打造智算时代最佳服务器操作系统
本次分享的主题是阿里云与龙蜥携手打造智算时代最佳服务器操作系统,由阿里云技术软件部产品总监张鹏程分享。主要分为三个部分: 1.开源社区 2.操作系统 3.云 + AI
332 0
阿里云与龙蜥携手打造智算时代最佳服务器操作系统
|
9月前
|
机器学习/深度学习 数据采集
《机器学习模型快速收敛的秘籍大揭秘》
在机器学习中,快速收敛是提高效率和节省资源的关键。常用方法包括:选择合适的优化器(如Adam、RMSProp等),动态调整学习率,使用预训练模型,进行数据预处理,合理选择模型结构,应用批量归一化,以及增加训练数据。这些策略能有效加速模型收敛,提升性能并减少训练时间。
286 7
|
12月前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【7月更文挑战第14天】Pandas与NumPy在数据科学中扮演关键角色。Pandas的DataFrame和Series提供高效数据处理,如数据清洗、转换,而NumPy则以ndarray为基础进行数值计算和矩阵操作。两者结合,从数据预处理到数值分析,形成强大工具组合。示例展示了填充缺失值、类型转换、矩阵乘法、标准化等操作,体现其在实际项目中的协同效用。掌握这两者,能提升数据科学家的效能和分析深度。**
164 0
|
数据可视化 Python
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
762 0
|
人工智能 自然语言处理 测试技术
“送云资源、用大模型” 阿里云启动云工开物“高校训练营”计划
“送云资源、用大模型” 阿里云启动云工开物“高校训练营”计划
478 1