合格的程序员不仅要让代码跑起来,还要让代码干净,只要满足编译器和机器都能运行,而写出代码的程序不会被认为是开发人员,甚至不是编码员。好的命名能够体现代码的特点、意义或目的,使读者能够根据名字的含义快速理清程序的上下文。本文分享以下代码命名套路,改进我们的代码命名:不要含糊,准确表达意思,避免误导做有意义的区分结合上下文简化名称使用可搜索和易于阅读的名称封装命名约定相信每个程序员一直被某些人的垃圾代码所厌恶,导致开发进度严重拖延,性能不佳,bug多。每次增加和修改代码,都是如履薄冰,只有知道那一堆烂代码才敢修改。久而久之,团队的生产力下降,大家都抵制这个项目,无能为力。新手不熟悉原场景和设计,不知道如何修改才符合实际意图,从而导致混乱。最终,开发团队反叛了,再也无法忍受在这个垃圾之上进行构建,而管理层也不愿意投入资源进行重新设计。一个好的开发人员应该始终保持代码干净,无论截止日期如何。为什么要写垃圾代码?可能有人会说需求变更违背了最初的设计,工期太紧没办法做好……其实这是不专业的借口。推动进步是产品经理应该做的事情。尽管他们执着于进步,但大多数产品经理也期望拥有良好的可扩展代码,以应对市场不可预知的需求。连海誓山盟的爱都会变,那怎么保证要求不变呢?因此,我们比他们更注重代码质量,以应对不断变化的需求。保持代码干净优雅是每一个优秀的开发者都应该遵守的原则。乱七八糟的代码只会减慢未来的开发速度,而加快速度的唯一方法:始终保持代码尽可能干净和优雅。就像医生在进行手术之前必须进行消毒一样。你说消毒太费时间了,用小刀固定就好了。作为一名专业医生,你会这样做吗?作为一名专业的程序员,我们需要了解代码变坏的风险,并坚持保持代码质量。什么是cleancode代码质量评价需要综合各种因素得出,不能从单一的维度来判断。比如代码的可读性好,但是空间和时间复杂度高,不能算是好代码。好的代码应该具备:易于扩展和维护、简洁(只做好一件事)、复用性强(无重复代码)、能够快速编写单元测试。可读且没有副作用(确实超出了名称)。易于扩展和维护在不破坏原有代码设计的情况下,您可以简单快速地修改和添加代码,实现功能扩展。简单来说就是预留扩展点,将新的代码放在设计的可扩展点,这样就不会因为一个新的功能而改动大量的原有代码。修改封闭,扩展开放,开闭原则。对于开发,我们花更多的时间维护旧代码而不是新项目的新代码。代码的可维护性变得非常重要,即代码层次清晰,模块划分准确,满足高内聚低耦合,抽象出合理的接口。面向接口编程意味着更好的可维护性。同样的代码,熟悉他的高级工程师会觉得维护起来容易,但新人因为不熟悉代码和设计模式,看不懂。因此,容易扩展是主观的。我们需要提高基本功,才有资格说代码是否易于扩展和维护。只做一件事,承担一个责任:每个功能、每个类、每个模块只专注于一件事。不要设计大而全的类或功能,我们需要将它们拆分成功能更细粒度和功能单一的类。它没有隐藏设计者的意图,具有清晰的抽象和直接的控制语句。我们应该让每个功能和每一行代码都简单、合乎逻辑。这样,类依赖和依赖类就会变少,降低耦合度。需要注意的是,拆分不能太细,否则会破坏凝聚力。高手就是用最简单的方法解决复杂的问题。NoDuplicateCode在开发过程中,我们应该尽可能抽象出“变化和不变”,复用现有代码,不要编写重复代码。例如,利用“封装、继承、抽象、多态”特性,将代码封装成模块,隐藏变化的细节,暴露不变的接口。分析业务和非业务代码逻辑,抽象成通用的框架、工具等。例如,采用模板方法设计模式定义不变的算法逻辑框架,将变化点延迟到子类重写。能快速写成单元测试的代码可测试性差,写单元测试难度更大,基本说明代码设计有问题。试想,如果一个类又大又全,有一个方法要依赖十几个外部对象才能完成工作,耦合性就严重了。当您编写单元测试时,您需要模拟一打依赖对象和数据。这意味着代码很烂,需要适当地拆分和设计。可读性软件设计大师MartinFowler说:“任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员可以编写人类可以理解的代码。”翻译成中文是:“任何傻瓜都可以编写计算机可以理解的代码。。优秀的程序员可以编写人类可以理解的代码。“而可读性会涉及编码标准、命名、注释、功能职责是否单一、长度是否精简。有数据显示,阅读代码的时间与编写代码的时间之比超过10:1,而现在代码的编写难度,取决于阅读周边代码的难度。所以我认为可读性是最重要的一点。经过优质命名例程的开发过程,命名随处可见。我们命名变量、方法、参数、类、包。而命名的好坏会影响我们的可读性。我们不妨从命名为切入点写出好的代码。不要含糊,准确表达你的意思。在开发过程中,一旦找到更好的名字,就把旧的换掉。一个变量、方法或类的名字应该表明它应该做什么。根据名字,我们可以知道它能做什么以及如何使用。如果一个名字需要很多评论ts来补充,避免用户跳坑,名不副实。变量名体现了该字段的功能,如LocalDatenow=LocaDate.now();now标识当前时间。防止必须基于大量上下文才能理解的歧义和不可理解的代码。不要使用魔法。反例1:使用幻数//从数据库获取列表ListbuyerList=dao.getList();buyerList.forEach(x->{for(inti=1;i<=5;i++){processedBuyerList.add(String.format("%s,%s",i,x));}});你可能想知道为什么索引从1开始?为什么<=5。另外,i和1很像,很难区分。正确的做法应该是使用名字的实际含义让人明白这样写的目的,否则维护者会吃亏。反例2:用生僻字,又臭又长的UltimateAssociatedSubjectRunBatchServiceImpl,我们看到这样的类名,是不是不知道怎么读?不会搜索定位,也不知道表达的意思是什么。可能起这个名字的人以为是准确的表述,其实是“王阿姨的裹脚布,又臭又长”。业务本义是:执行Link主体任务相关的业务类。鉴于此,我们首先要避免使用生僻词,我们可以将其命名为LinkSubjectServiceImpl,这样可以简单明了地表达出链接主题的业务逻辑在这个类中。不要误导尽量不要使用差别很小的名字,以免别人一眼就看出这两个名字是什么意思。比如:函数deleteIndex和函数deleteIndexEx,这两个函数名的区别很小,而且函数deleteIndexEx后面的Ex还是缩写,不知道是什么意思,其他的只能理解了通过查看功能内容来区分两者。XYZStringHandler和XYZStringStorage。用户控制器和用户信息控制器。让人抓狂,到底是一样的还是不一样的?有什么不同?没有两年的脑血栓。反例3:名称与名称不匹配下面是一个生成文件并提供下载功能的接口。publicvoiddownloadExcel(HttpServletResponseresponse){Listfiles=listFile();StringfileName=System.currentTimeMillis()+".zip";DownloadZip.downLoadFiles(files,filePath);DownloadZip.fileDownload(response,filePath,fileName);}我们会疑惑,downLoadFiles和fileDownload有什么区别?为什么你需要调用它两次。这种东西真的是脑血栓十年才写出来的。downLoadFiles的作用是创建文件并打包成zip文件,而fileDownload是输出指定的文件到浏览器进行下载。所以为了合理区分,downLoadFiles应该命名为createZipFile,避免误导孩子。对getActiveOrder();进行有意义的区分。getActiveOrderInfo();getActiveOrderData();getActiveOrders();以上都是废话,你怎么知道调用哪个方法呢?哪一个代表订单详情?或者历史订单,或者所有订单查询,bullshit是另一个没有意义的区别。名称不同,但意思是一样的。Order、OrderInfo、OrderData,它们同名,但意思相同,无意义的废话。在没有明确约定的情况下,变量moneyAmount与金钱无法区分。Variable一词永远不应出现在变量名称中。Table一词永远不应出现在表名中。结合上下文简化命名publicclassOrder{privateStringorderNum;privateStringorderCreateTime;//...}比如Order类,在这个上下文中,不需要为每个成员变量重复添加前缀词序,直接命名即可创建时间,数量。因为我们可以通过Order的上下文来获取信息。Orderorder=newOrder();order.getCreateTime();名字易读、易搜索、易读,就是不要使用一些生僻的词或难发音的词。Searchability方便使用IED的自动补全和搜索功能,可以根据我们的命名约定快速定位到你要查找的类或方法。可读的名字读不出来,讨论的时候像个沙雕。咦,“treeNewBeeAxibaKula”类的作用是什么?听到这样的名字是令人尴尬和致癌的。用一些生僻字就好比“王阿姨的裹脚布,又长又臭”,两年不脑血栓我写不出这样的垃圾代码。可搜索的简易爆炸装置非常智能。当我们输入“Hash”时,会列出所有与Hash相关的类。命名的时候,最好符合项目的命名习惯。列表数据查询大家都用listXXX,你不应该用queryXXX。统一命名规范非常重要。包名包名统一小写,点分隔符之间只有一个具有自然语义的英文单词或多个单词自然连接在一起(如springframework,deepspace不需要使用任何切分)。包名的组成可以分为以下四部分[前缀][发起者名称][项目名称][模块名称]。下表授权给《Java填坑笔记》。常见的前缀可分为以下几类:类名和类名应以驼峰形式命名,并使用名词或名词短语,如:Customer、Account。避免使用Manager、Processor等动词。接口名称除了名词和名词短语外,还可以使用形容词或形容词短语,如Cloneable、Callable等,表示实现该接口的类具有一定的功能或能力。方法名方法名一般是动词或动词短语,与参数或参数名组成动宾短语,即动词+名词。一个好的函数名一般可以通过名字直接知道这个函数实现了什么功能。布尔返回值的方法注:Prefix-prefix、Suffix-suffix、Alone-单独使用的按需执行方法,用于检查异步相关方法回调方法,操作对象生命周期方法4.7集合操作相关方法,与数据相关的含义成对出现的动词getgetsetsetaddaddremovedeletecreatecreatedestroyremovestartstartstopstopopenopencloseclosereadreadwriteloadloadsavecreatecreatedestroycreatedestroybeginendendbackupbackuprestorerestoreimportimportexportexportsplitsplitmergemergeinjectinjectextractextractattachattachdetach分离bindbindseparateviewviewbrowsebrowseeditmodifyselectselectmarkmarkcopycopypasteundoundoredoredoinsertinsertdeleteremoveaddappendaddcleanclearclearindexindexsortfindfindsearchsearchincreaseincreasedecrease减少播放,播放暂停,pauselaunch,startrun,runcompile,compileexecute,executedebug,debugtrace,trackobserve,observelistenbuildbuildpublishpublishinputinputoutputoutputencodedecodedecodeencryptencryptdecryptdecryptdecryptcompresscompressdecompressdecompresspackpackunpackunpackparseemitgenerateconnectconnectdisconnectdisconnectsendsend接收接收下载下载上传刷新刷新同步更新同步更新恢复恢复锁锁解锁解锁签出签出签入签入提交提交提交collapsefoldbeginstartendendstartstartfinishenterenterexitabortquitquitleaveobsoletediscarddepreciatewastecollectcollectaggregateaggregatesummary命名的目的是让代码和工程师进行对话,增强代码的可读性和可维护性优秀的代码往往可以以名字为人所知。本文转载自微信公众号《码哥字节》