TUhjnbcbe - 2024/9/30 15:59:00
前言用了很久的摸鱼时间,才把《代码整洁之道》看完。不得不承认自己平时写代码真的很随意,随着工作中CodeReview的深入,才越来越觉得之前的自己是多么渺小,总觉得所谓优雅的代码是哗众取宠。这篇文章,算是我对整本书的一个归纳,很多细节着实能让我们写出漂亮的代码,至少不会让同事看到就想骂:什么xx代码!当然什么样是好的代码,谁也说不清,我在读这本书的时候也产生很多的疑问,文中也有些内容并没有给出正面的解释。不过这不妨碍我们取其精华。正所谓:尽信书,不如无书。正文一、命名命名有意义a、b、c…这种命名没有任何意义不加废话ProductInfo:Info就是废话(Info没啥意义)nameString:String就是废话(name不会有int型)不用俚语、双关等文学上的东西合理的包装变量例如:某几个变量是用来描述一种业务。那么可以用对应业务的class来封装这几个变量可供搜索的命名全局搜索MAX_LASSES_PER_STUDENT,总比搜索7要容易二、函数只做一件事(单一职责原则SRP)合理情况:拆成两个方法。一个checkUserName()检查字段(询问);一个setAttitude()设置字段(指令)这一件事指:另一抽象维度下的逻辑,有可能是多个,但要是同一维度每一个函数,代表着一个抽象维度阅读代码,就可以自顶向下,高维度-低纬度的顺序阅读分隔指令与询问if(set(username))…这一个set方法,涵盖了两层含义:setusername,并且如果set成功返回true。switch尽可能用多态替换switchswitch尽可能埋在抽象程度高的模块中参数尽可能的少(比如没有参数)无副作用例如:check账号密码是否匹配的方法,内部实现不应该偷摸地执行其他逻辑,比如初始化某个页面,这不职责单一。输出型参数避免使用有有疑惑性的输出型参数。例如:appendFooter(s)。仅凭函数名无法确认是把s添加到谁的后面,或者把谁添加到s后面。应该改成:s.appendFooter():就能明白是给s添加一些footer用异常代替返回错误码对补充分隔指令与询问错误码意味了有可能存在一个方法涵盖多层含义,这种case下可以使用异常来代码错误码注释应该用好的函数风格来注释代码暗含时序性的函数,应该显示的设计函数签名,比如B函数的入参是A函数的出参三、对象和数据结构有针对性的private/public数据结构和对象的对立数据结构:暴露数据对象:封装数据,暴露操作数据的函数面对对象和面向过程的对立面向对象:多态意味着想在接口上增加函数是困难的,需要改所有的实现面向过程:没有多态特性,意味着代码都要强依赖数据结构,因此增加数据结构是困难的。需要修改所有依赖数据结构的地方二者应该相辅相成Demeter定律(最少知识原则)函数不应该调用有任何函数返回的对象的方法数据结构除外,数据结构就是对外暴露细节通俗解释:人可以命令一条狗行走,但是不应该直接指挥狗的腿行走,应该由狗去指挥控制它的腿如何行走。问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。好处:降低耦合四、错误处理用异常代替错误状态码收敛错误逻辑避免遗忘错误逻辑(throw异常,强制提醒)使用运行时异常(?)非运行时异常,要么try要么throw,因此就意味着较底层的方法throw一个异常,整个引用链都得进行修改PS:个人认为,有些时候throw异常是有必要的,需要显示的告诉调用者,这里有异常。充分的错误信息收敛三方异常自定义一个异常用于收敛外部的异常逻辑收敛,以后发生改动也只需要改动收敛的代码即可不返回null返回默认值或者抛异常同样也不随意传入一个null五、类类的名称就已经能够预见类的职责不建议用很大scope的命名,比如:Manager单一职责内聚依赖更少的外部信息(如方法入参少)暴露更少的public方法保证单一职责情况下,尽可能的内聚类逻辑爆炸,就意味着需要按职责拆更多的独立类开闭原则对拓展开放,对修改关闭依赖倒置依赖抽象,而不是依赖实现六、系统构造与使用分离下图:把LineItem实例的实例化拆到OrderProcessing中,脱离业务代码main。而LineItem的实现由业务代码main实现。依赖注入(控制反转)服务发现就是一种依赖注入思想的实现,将实例化的过程交给服务发现框架去处理好处就是按需加载。按需的逻辑都抽到了注入模块AOP(面向切面编程)切面如何理解切面:独立的能力,比如:日志(此语境下的面向切面,也就是说面向日志)横向如何理解横向:业务代码从面向对象的角度,它属于纵向的形式(层层调用)。那么对于对应我们的切面就是横向的。在合适的切点上横向的贯穿进整个需要的切面业务代码中。好处整个切面是一个独立模块,那么无侵入地将切面代码织入到业务代码的特定切点上。既能解耦/分离