你会给变量起的什么名字(你会给变量起的什么名字英文)
mhr18 2025-04-05 20:30 23 浏览 0 评论
先起一个名字
在进行项目编写的过程中,免不了的就是要进行各种方法、变量的命名。你一定经历过对变量命名无比困难的时候。而有的时候命名就看起来很轻松,比如新增一个领域实体的时候。那用户(user)来举例子,可能还没有进行更多的思考,但 addUser的方法就已经创建了。工作完成,可喜可贺。
但真的是这样吗?有多少同学在进行后续的代码翻阅的时候,反而发现别的同学的接口使用了saveXxx的命名方式?该跟他保持一致吗?还是继续我行我素?
如果在团队中的命名规范不明确的话,这种情况确实会出现。而比表面上看起来更严重的问题是:save和add真的一样吗?如果在没有统一的命名规范的情况下,save 和 add中可能存在语言的区别,当别人看见你的接口命名发现不一样,而你的注释又不那么完备的时候。如果使用你接口的同学尽职尽责,那他可能会花费时间去确认你底层业务逻辑是否一致。又或者这个问题先放一放,让问题到自测的时候再去检验。
什么是好命名?
这个问题不好直接回答。但尽管不能精准地描述出一个概念,我们却可以用一系列描述勾勒出命名的轮廓:
- 意如其文
- 避免歧义
- 无冗余的信息
- 可以检索
- 无类型编码
- 区分方法还是类名
- 统一命名
- 为命名创造合适的语境
那么每当你对一个对象起名的时候,可以快速地在脑内回忆一遍列表,看看他是不是满足以上的内容。一开始可能需要对照着Check List,但当这个步骤熟练了之后,就可以一闪而过判断出:“目前的不够好,让我再想想”。
让我仔细想想
仅有Check List并不完全够,我们还需要理解一下概念。能够快速反映出来场景,用反例的方式来判断条件是否满足。
意如其文
我觉得应该是最好理解的一条了,好的代码应该是有解释性的,命名可以表示出你要进行的“动作”、你可能需要的内容、以及你希望修改的东西。取名叫 endTime就好过 t。同样的,在for循环中的i是什么,需要在看for中所有的逻辑的时候都记着,那索性就不如直接命名为 robotMoveStep,这样还可以释放本身就宝贵的脑细胞。而对于一些魔法值例如 4如果不知道上下文的话,那就很难判断他所指代的是什么,这时候就不如用常量来替代,即便知识变成了类变量,也好多一个单独的 4在代码里。
避免歧义
在阿里巴巴的代码规范中有几个例子就如此例如:对于Long类型 用大写的字母表示比如 1L,就是为了避免 11和 1l(1L的小写)的尴尬。同样的,如果使用了一些特殊类型的命名时也会这样,比如 userList,结果发现其实是一个它是一个 int[],或许它的背景是从一开始的 userList变成了 userIds,但无论如何代码总是胜过于解释。
无冗余的信息
一般来说,我们不会主动给命名增加冗余信息。user就是user,但是如果在当时想要新增一个新的子领域对象的时候扩展呢?userInfo、extendUserInfo、extendUserInfoNew?这并不是不会发生的事情,事实上正因为他发生了,且一旦发生就难以调整,我们才要极力地避免。添加一个后缀看起来是一个简单区分的好主意,但是这个实际上也和“意如其文”是一个问题。当一个新的人仅仅看到名称了之后并无法区分他们有什么区别,那么可以进行开发就需要对他们了如指掌才行。仅仅为了确保修改一个功能正确,只能一个一个去确认逻辑,把上下文翻个底朝天。冗余的是废话,是无意义的,就应该去掉,如果真的需要添加区分,就应该增加可以提供鉴别能力的方式,例如 userContactInformation。
可以检索
你可以想想,当出现了一个bug,然后其他端的同学提示你说是由于传输数值的问题,而变量名是 sum。那么我想,下一步个流程就是确认接口是什么,然后一头扎进了 sum是怎么获得的道路上,有可能在过了很长时间之后,你才意识到这个 sum甚至不是你的代码里处理得到的,而是直接通过下游系统获得的。确实没有什么好办法,因为 sum充斥在工程的各个地方。如果这个名称不是 sum,而是叫 totalUserSubmitCount呢?我想在IDEA的帮助下,下一步应该是全局检索,而这么精确的名称涉及到的问题就也没有那么多了。当然,并不是说不能使用sum、count这种名称,但如果你使用了,就应该尽量让他们作为一个局部变量呆在一个方法里面。
无类型编码
java是一个强类型语言,你不需要特别地指定它的类型,所以 mobileStr这种的命名其实是冗余的,String mobile;就足够了,而当有一天 mobileStr变成了 Long mobileStr的时候,也不会引起额外的误会。
区分方法还是类名
java是面向对象的语言,所以一个类应该是描述的一个对象,那么我们描述一个对象的时候,应该是一个名词;而对象中的方法的时候则应该是对象所具有的能力,所以描述方法应该是动词。
统一命名
就如同开头说的,经常而言,对于save和add,他们的常用语义是不同的,如果混用会让吃过一次亏的人在看你所有的代码的时候都会小心翼翼。那么 get和 find又有什么区别呢?如果这个概念没有统一,那么你就需要记住隔壁小王是用的 find;隔壁小张的 save其实不会更新已有对象;对门小李的 add方法其实是追加(append)功能。
而除了开发同学之外,这个命名也最好和领域本身的命名是统一的。这样在即便是在跟对应的产品,或者业务方进行沟通的时候,在脑子里就不用进行思维上的转换,可以大大地提高沟通效率。举例而言,如果存在两种领域的商家员工和个人用户,那么直接使用 customer 和 employee大家都可以顺畅理解,而如果要叫 user 和 userV2的话恐怕就要再约一次会了。
但是如果这方面已经不涉及领域信息了,那也尽量和业内中的名词进行统一,比如redis的 aof,或者是mysql中的 binlog,这种已经存在且有一定语境的名称,可以提高他人理解你业务的速度。
特别注意的是这个“命名”对于它的中文描述名称是一样的。
为命名创造合适的语境
因为名称之间本身就是有解释性的,所以在进行一组一组命名的时候,就可以提供上下文信息。例如如果有一组方法 login()、logoff()那看起来就是用来进行登录登出的;又或者是一组属性如:price、payTime、couponCode,那么看起来就是订单相关的对象。想这样将一组有交互关系的名称放在一起的时候就可以为支撑的对象、业务提供一个语境,从而帮助理解业务流程。
但是要尽量避免添加无意义的语境,比如 orderPrice、orderPayTime、orderCouponCode,那么他们中的order显然是无意义的,因为并不会对属性的命名提供帮助,而试试上在实际的值的获取时我们一般是使用 order.getOrderPrice(),那这时候的order就显得更加冗余了。
最后
本文在《Clean Code》中列举的很多例子的基础上,加入了自己的个人理解。当然也忽略部分书中提到的点,觉得不是问题或问题不太严重:比如“尽量使用可以读得出来的命名”,而在在沟通的时候可以使用中文;又比如“别扮可爱”,在目前比较卷的环境中大家相对都很专业,出现概率比较小。
当然每个团队都有自己的一套规范,总的来说可以让coding更加顺利,我们的目的就达到了。
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)