当前位置: 首页 > 科技观察

让我们简单谈谈编程中令人头疼的问题之一,命名

时间:2023-03-21 18:17:56 科技观察

在编程的过程中,让我们头疼的事情太多了,比如命名、维护别人的代码、写测试、和别人交流等等。连世界级的软件大师MartinFowler都说CS领域最难的有两件事,一是缓存失效,二是程序命名(@https://martinfowler.com/bliki/TwoHardThings.html)。今天贵德就单独说说“命名”。据说,在Quora网站上,近5000名程序员投票选出的最难的事情就是“命名”。为什么要注意命名?好的命名是一种评论。当别人看到你的命名时,他们就会知道你的变量、方法或类是干什么的!好的命名对于其他人(包括你自己)理解你的代码非常重要。帮助很大!只是一个简单的例子来说明命名的重要性。《Clean Code》本书明确指出:“好的代码本身就是一种注释,我们应该尽量规范和美化我们的代码,减少不必要的注释。如果编程语言的表现力足够,注释就不需要细说了。例如:删除下面的复杂注释,只需创建一个函数,它的功能与注释所说的//checktoseeiftheemployeeiseligibleforfullbenefitsif((employee.flags&HOURLY_FLAG)&&(employee.age>65))应该替换为if(employee.isEligibleForFullBenefits())常用命名规则及适用场景这里只介绍最常用的三种命名约定。CamelCase应该是我们最常见的一种。这种命名方式使用大小写混合格式来区分每个单词,单词之间没有空格或连接字符分隔。方法(CamelCase)类名需要使用UpperCamelCase正例:ServiceDiscovery、ServiceInstance、LruCacheFactory反例:serviceDiscovery、ServiceInstance、LRUCacheFactory方法名、参数名、成员变量、局部变量需要使用LowerCamelCase。正例:getUserInfo()、createCustomThreadPool()、setNameFormat(StringnameFormat)UserviceuserService;反例:GetUserInfo(),CreateCustomThreadPool(),setNameFormat(StringNameFormat)Userviceuser_service蛇形命名法(snake_case)需要使用测试方法名、常量、枚举名蛇形命名法(snake_case)蛇形命名法中,单词之间用下划线连接“_”,如should_get_200_status_code_when_request_is_valid、CLIENT_CONNECT_SERVER_FAILURE。蛇形命名法的好处是当需要命名的词比较多的时候,比如我通过小驼峰命名法给大家展示一下上面的命名法:“shouldGet200StatusCodoWhenRequestIsValid”。感觉如何?它的可读性不如使用snake_case吗?**正例:@Testvoidshould_get_200_status_code_when_request_is_valid(){...}反例:@TestvoidshouldGet200StatusCodoWhenRequestIsValid(){......}字符串命名法(kebab-case)在字符串命名法中,每个单词由下划线“-”连接",比如dubbo-registry。项目文件夹名称推荐使用字符串命名方式(kebab-case)。比如dubbo项目的各个模块的命名如下。常用命名约定Java语言基本命名约定1.类名需要使用UpperCamelCase风格。方法名、参数名、成员变量和局部变量需要使用lowerCamelCase。**2。测试方法名、常量、枚举名需要使用snake_case**,如should_get_200_status_code_when_request_is_valid、CLIENT_CONNECT_SERVER_FAILURE。此外,测试方法名称必须全部小写,常量和枚举名称必须全部大写。3、项目文件夹名称采用字符串命名法(kebab-case),如dubbo-registry。4、包名统一使用小写,包名尽量使用单个名词,每个单词之间用“.”连接。分隔符,每个单词必须是单数。正例:org.apache.dubbo.common.threadlocal反例:org.apache.dubbo.common.threadLocal5、抽象类名以Abstract开头。//为远程传输部分抽象出来的一个抽象类(来源:Dubbo源码)publicabstractclassAbstractClienttextendsAbstractEndpointimplementsClient{}6.异常类名以Exception结尾。//自定义NoSuchMethodException(来源:Dubbo源码)publicclassNoSuchMethodExceptionextendsRuntimeException{privatestaticfinallongserialVersionUID=-2725364246023268766L;publicNoSuchMethodException(){super();}publicNoSuchMethodException(String}msg){要测试的类以它命名}msg){类名以Test开头和结尾。//为AnnotationUtils类编写的测试类(来源:Dubbo源码)publicclassAnnotationUtilsTest{...}POJO类中的布尔变量不要加is前缀,否则某些帧解析会导致序列化错误。如果模块、接口、类或方法使用了设计模式,则在命名时需要体现具体的模式。命名易读性规范1.为了使命名更易理解和可读,尽量不要缩写/缩写词,除非这些词已经被识别为这样缩写/缩写。例如,CustomThreadFactory不能写成~~CustomTF。2.命名不要像函数一样短,可读的名字优先于短的名字,虽然可读的名字会更长。这对应于我们上面提到的第1点。3、避免无意义的命名,取的每一个名字都要能表达意思。正例:UserServiceuserService;int用户数;反例:UserServiceserviceintcount4.避免太长的名字(50个字符以内最好),太长的名字难读难看。5、不要用拼音,更不要用中文。注:alibaba、wuhan、taobao等国际词可按英文处理。正例:discount反例:dazheCodelf:变量命名神器?这是一个由中国人开发的网站。网上很多人称之为变量命名神器。Guide用了几天,感觉用处不大。朋友们可以自己去体验一下,然后给出自己的判断。Codelf提供了一个在线版本的网站:https://unbug.github.io/codelf/,具体使用方法如下:我选择了Java编程语言,然后搜索关键词“serialization”,结果返回了A很多关于序列化的命名。此外,Codelf还提供了一个VS代码插件。看这篇评测,看来大家还是很喜欢这个命名工具的。SummaryGuide做了一张思维导图,涵盖了以上所有重要内容,方便朋友们日后参考。