前言大家好,我是捡蜗牛的小男孩。毕业五年多,一共在3家公司工作过,遇到过各种各样的同事,看过各种各样的代码,有的优雅,顺眼,有的垃圾,一坨屎。因此,写这篇文章,记录一个优秀的后端开发程序员应该具备哪些良好的开发习惯。1、注释尽量全面,对于接口方法、类、复杂的业务逻辑,要加上有意义的注释。对于接口方法的注释,应该包括详细的入参和结果描述,抛出异常的情况也应该详细描述。类的注释应该包含类的功能描述、作者和修饰符。如果是业务逻辑复杂的代码,写清楚注释确实很有必要。清晰的注释更有利于后续的维护。2.合理的项目拆分目录结构记得上大学的时候,刚学会做各种管理系统,都是用的MVC模型,也就是controller、service、mapper、entity。如果以后业务扩展,如果不拆分业务架构,你可能会发现一个服务包下有几百个服务。..正确的做法是,如果服务太多,应该按照不同的业务进行划分,比如订单、登录、积分等。当然你也可以按照不同的业务划分模块,比如构建一个moudles包,然后是order,login等业务划分,每个业务都有自己的controller,service,mapper,entity。我们拆分的目的是为了让项目结构更清晰,更易读,更容易维护。3、不要在循环中进行远程调用或数据库操作,优先考虑批量操作。远程操作或者数据库操作比较耗费网络和IO资源,所以尽量不要在循环中远程调用,不要在循环中操作数据库,一次批量返回,尽量不要循环多次。(不过,如果是操作数据库的话,一次查的数据不要太多,一次batch500即可)。正例:remoteBatchQuery(param);反例:for(inti=0;iorders=newVector();publicvoidprintOwing(){//打印横幅System.out.println("****************");System.out.println("*****客户欠款*****");System.out.println("*************");//计算总金额Enumerationenv=orders.elements();双总金额=0.0;while(env.hasMoreElements()){Orderorder=(Order)env.nextElement();totalAmount+=order.getAmout();}//打印细节System.out.println("name:"+name);System.out.println("金额:"+totalAmount);......}}其实可以使用Extract方法,将单个函数的代码段抽取出来,形成名字清晰的小函数,从而解决长函数的问题。例如:publicclassTest{privateStringname;privateVectororders=newVector();publicvoidprintOwing(){//打印横幅printBanner();//校准culatetotalAmountdoubletotalAmount=getTotalAmount();//打印细节printDetail(totalAmount);}voidprintBanner(){System.out.println("****************");System.out.println("******客户欠款*****");System.out.println("******************");}doublegetTotalAmount(){枚举env=orders.elements();双总金额=0.0;while(env.hasMoreElements()){Orderorder=(Order)env.nextElement();totalAmount+=order.getAmout();}返回总金额;}voidprintDetail(doubletotalAmount){System.out.println("name:"+name);System.out.println("金额:"+totalAmount);}}11。在finally块中释放资源大家应该都有过这样的经历。如果你在windows系统的桌面上打开过多的文件或系统软件,你会感觉电脑卡住了。如果不关闭,那么这个IO资源就会被它占用,让别人无法使用,造成资源浪费。当我们操作完文件资源后,我们需要在finally块中释放资源。文件输入流fdIn=null;try{fdIn=newFileInputStream(newFile("/公众号_捡蜗牛的小男孩.txt"));}catch(FileNotFoundExceptione){log.error(e);}catch(IOExceptione){log.error(e);}finally{try{if(fdIn!=null){fdIn.close();}}catch(IOExceptione){log.error(e);}}12。把日志打印出来在日常开发中,一定要将日志打印出来。比如:你实现转账业务,转了几百万,然后转账失败,然后客户投诉,然后你还没有打印日志。想想那可怕的情况,但你无能为力。..一般情况下,方法输入输出参数需要打印日志,出现异常时也要打印日志等,如下:publicvoidtransfer(TransferDTOtransferDTO){log.info("invoketranferbegin");//打印输入参数log.info("invoketranfer,paramters:{}",transferDTO);试试{res=transferService.transfer(transferDTO);}catch(Exceptione){log.error("transferfail,account:{}",transferDTO.getAccount())log.error("transferfail,exception:{}",e);}log.info("调用传输结束");}之前写过打印日志的15条建议,大家可以看看看看:工作总结!15日志打印建议13.考虑异常,处理好异常优秀的后端开发应该考虑异常,处理好异常。天罗哥给你10条异常处理建议:尽量不要用e.printStackTrace(),而是用log打印。因为e.printStackTrace()语句可能会导致内存被占满。捕获异常时,建议将具体的异常打印出来,以便更好的定位问题。不要使用Exception来捕获所有可能的异常。记得使用finally来关闭流资源或者直接使用try-with-resource。捕获的异常和抛出的异常必须完全匹配,或者捕获的异常是抛出异常的父类捕获的异常。它不容忽视。至少记录一下。注意异常对您的代码层次结构的入侵。自定义封装异常,不要丢弃原始异常Throwable导致运行时异常RuntimeException的信息,不应被catch处理,而是先进行预检,如:NullPointerException处理注意异常匹配的顺序,并给出优先捕捉特定的异常14.考虑系统和接口的兼容性优秀的后端开发都会考虑系统和接口的兼容性。如果修改旧的外部接口,则不兼容。这个问题可能比较严重,甚至可能直接导致系统发布失败。新手程序员很容易犯这个错误~因此,如果你的需求是修改原有的接口,尤其是这个接口对外提供服务的话,一定要考虑接口兼容性。比如dubbo接口本来只接收参数A和B,现在你加了一个参数C,你可以考虑这样处理://OldinterfacevoidoldService(A,B){//兼容newInterface,通过anullinsteadofCnewService(A,B,null);}//新接口,旧接口暂时不能删除,需要兼容。voidnewService(A,B,C){...}15.采取措施避免运行时错误优秀的后端开发应该在写代码的阶段就采取措施避免运行时错误,例如数组边界溢出,被清零运行时整数除法、空指针等错误。类似的代码比较常见:Stringname=list.get(1).getName();//list可能越界,因为不一定有2个元素,所以要采取措施防止数组边界溢出,如下:if(CollectionsUtil.isNotEmpty(list)&&list.size()>1){字符串名称=list.get(1).getName();}