这些开发好习惯都是优秀后端应该具备的!!

优秀程序猿应具备的15个开发好习惯 ​ 写这篇文章,来记录下一个优秀的程序猿应该有哪些好的开发习惯。 1.注释尽可能全面,写有意义的方法注释 接口方法、类、复杂的业务逻辑,都应该添加有意义的注释 对于接口方法的注释,应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述 类的注释应该包含类的功能说明、作者和修改者。 如果是业务逻辑很复杂的代码,真的非常有必要写清楚注释。 清楚的注释,更有利于后面的维护。 2.项目拆分合理的目录结构 记得读大学那会,刚学做各种各样的管理系统,都是用MVC模式,也就是controller、service 阅读详情

1.注释尽可能全面,写有意义的注释

接口方法、类、复杂的业务逻辑,都应该添加有意义的注释

  • 对于接口方法的注释,应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述

  • 类的注释应该包含类的功能说明、作者和修改者。

  • 如果是业务逻辑很复杂的代码,真的非常有必要写清楚注释。

清楚的注释,更有利于后面的维护。

2.项目拆分合理的目录结构

记得读大学那会,刚学做各种各样的管理系统,都是用MVC模式,也就是controller、service、mapper、entity。如果未来业务扩展,你没有拆分业务结构的话,很可能就会发现,一个service包下,有上百个服务。。。

正确的做法,如果服务过多,应该根据不同的业务进行划分,比如订单、登陆、积分等等

​

当然,你也可以根据不同的业务划分模块,比如建一个moudles包,然后按订单、登陆等业务划分,每个业务都有自己的controller、service、mapper、entity。

我们拆分的目的,就是让项目结构更清晰,可读性更强,更容易维护而已。

3. 不在循环里远程调用、或者数据库操作,优先考虑批量进行。

远程操作或者数据库操作都是比较耗网络、IO资源的,所以尽量不在循环里远程调用、不在循环里操作数据库,能批量一次性查回来尽量不要循环多次去查。(但是呢,如果是操作数据库,也不要一次性查太多数据哈,可以分批500一次酱紫)。

正例:

remoteBatchQuery(param);

反例:

for(int i=0;i<n;i++){ remoteSingleQuery(param) }

​

4. 封装方法形参

如果你的方法参数过多,要封装一个对象出来。反例如下:

public void getUserInfo(String name,String age,String sex,String mobile,String idNo){ // do something ... }

如果参数很多,做新老接口兼容处理也比较麻烦。建议写个对象出来,如下:

public void getUserInfo(UserInfoParamDTO userInfoParamDTO){ // do something ... } class UserInfoParamDTO{ private String name; private String age; private String sex; private String mobile; private String idNo; }

5. 封装通用模板

一个优秀的后端开发,应该具备封装通用模板的编码能力。

我们来看一个业务需求:假设我们有这么一个业务场景:内部系统不同商户,调用我们系统接口,去跟外部第三方系统交互(http方式)。走类似这么一个流程,如下:

​

一个请求都会经历这几个流程:

  • 查询商户信息

  • 对请求报文加签

  • 发送http请求出去

  • 对返回的报文验签

通过HTTP发请求出去时,有的商户可能是走代理的,有的是走直连。假设当前有A,B商户接入,不少伙伴可能这么实现,伪代码如下:

// 商户A处理句柄 CompanyAHandler implements RequestHandler { Resp hander(req){ //查询商户信息 queryMerchantInfo(); //加签 signature(); //http请求(A商户假设走的是代理) httpRequestbyProxy() //验签 verify(); } } // 商户B处理句柄 CompanyBHandler implements RequestHandler { Resp hander(Rreq){ //查询商户信息 queryMerchantInfo(); //加签 signature(); // http请求(B商户不走代理,直连) httpRequestbyDirect(); // 验签 verify(); } }

假设新加一个C商户接入,你需要再实现一套这样的代码。显然,这样代码就重复了。这时候我们可以封装一个通用模板!我们就可以定义一个抽象类,包含请求流程的几个方法,伪代码如下:

abstract class AbstractMerchantService { //模板方法流程 Resp handlerTempPlate(req){ //查询商户信息 queryMerchantInfo(); //加签 signature(); //http 请求 httpRequest(); // 验签 verifySinature(); } // Http是否走代理(提供给子类实现) abstract boolean isRequestByProxy(); }

然后所有商户接入,都做这个流程。如果这个通用模板是你抽取的,别的小伙伴接到开发任务,都是接入你的模板,是不是会有点自豪呀,哈哈~

封装通用模板,就是抽个模板模式嘛?其实不仅仅是,而是自己对需求、代码的思考与总结,一种编程思想的升华。

6. 封装复杂的逻辑判断条件

我们来看下这段代码:

public void test(UserStatus userStatus){ if (userStatus != UserStatus.BANNED && userStatus != UserStatus.DELETED && userStatus != UserStatus.FROZEN) { //doSomeThing return } }

这段代码有什么问题呢?是的,逻辑判断条件太复杂啦,我们可以封装一下它。如下:

public void test(UserStatus userStatus){ if (isUserActive(userStatus)) { //doSomeThing } } private boolean isUserActive(UserStatus userStatus) { return userStatus != UserStatus.BANNED && userStatus != UserStatus.DELETED && userStatus != UserStatus.FROZEN; }

7. 保持优化性能的嗅觉

优秀的后端开发,应该保持优化性能的嗅觉。比如避免创建比必要的对象、异步处理、使用缓冲流,减少IO操作等等。

比如,我们设计一个APP首页的接口,它需要查用户信息、需要查banner信息、需要查弹窗信息等等。假设耗时如下:

​

查用户信息200ms,查banner信息100ms、查弹窗信息50ms,那一共就耗时350ms了。如果还查其他信息,那耗时就更大了。如何优化它呢?可以并行发起,耗时可以降为200ms。如下:

​

之前我写过一篇后端思维的文章,手把手教大家如何抽并行调用框架,大家可以看下:后端思维篇:手把手教你写一个并行调用模板

8. 可变参数的配置化处理

日常开发中,我们经常会遇到一些可变参数,比如用户多少天没登录注销、运营活动,不同节日红包皮肤切换、订单多久没付款就删除等等。对于这些可变的参数,不用该直接写死在代码。优秀的后端,要做配置化处理,你可以把这些可变参数,放到数据库一个配置表里面,也可以放到项目的配置文件或者apollo上。

比如产品经理提了个红包需求,圣诞节的时候,红包皮肤为圣诞节相关的,春节的时候,为春节红包皮肤等。如果在代码写死控制,可有类似以下代码:

if(duringChristmas){ img = redPacketChristmasSkin; }else if(duringSpringFestival){ img = redSpringFestivalSkin; }

如果到了元宵节的时候,运营小姐姐突然又有想法,红包皮肤换成灯笼相关的,这时候,是不是要去修改代码了,重新发布了?

从一开始接口设计时,可以实现一张红包皮肤的配置表,将红包皮肤做成配置化呢?更换红包皮肤,只需修改一下表数据就好了。当然,还有一些场景适合一些配置化的参数:一个分页多少数量控制、某个抢红包多久时间过期这些,都可以搞到参数配置化表里面。这也是扩展性思想的一种体现。

9. 会总结并使用工具类。

很多小伙伴,判断一个list是否为空,会这么写:

if (list == null || list.size() == 0) { return null; }

这样写呢,逻辑是没什么问题的。但是更建议用工具类,比如:

if (CollectionUtils.isEmpty(list)) { return null; }

日常开发中,我们既要会用工具类,更要学会自己去总结工具类。比如去文件处理工具类、日期处理工具类等等。这些都是优秀后端开发的一些好习惯。

10. 控制方法函数复杂度

你的方法不要写得太复杂,逻辑不要混乱,也不要太长。一个函数不能超过80行。写代码不仅仅是能跑就行,而是为了以后更好的维护。

反例如下:

public class Test { private String name; private Vector<Order> orders = new Vector<Order>(); public void printOwing() { //print banner System.out.println("****************"); System.out.println("*****customer Owes *****"); System.out.println("****************"); //calculate totalAmount Enumeration env = orders.elements(); double totalAmount = 0.0; while (env.hasMoreElements()) { Order order = (Order) env.nextElement(); totalAmount += order.getAmout(); } //print details System.out.println("name:" + name); System.out.println("amount:" + totalAmount); ...... } }

其实可以使用Extract Method,抽取功能单一的代码段,组成命名清晰的小函数,去解决长函数问题,正例如下:

public class Test { private String name; private Vector<Order> orders = new Vector<Order>(); public void printOwing() { //print banner printBanner(); //calculate totalAmount double totalAmount = getTotalAmount(); //print details printDetail(totalAmount); } void printBanner(){ System.out.println("****************"); System.out.println("*****customer Owes *****"); System.out.println("****************"); } double getTotalAmount(){ Enumeration env = orders.elements(); double totalAmount = 0.0; while (env.hasMoreElements()) { Order order = (Order) env.nextElement(); totalAmount += order.getAmout(); } return totalAmount; } void printDetail(double totalAmount){ System.out.println("name:" + name); System.out.println("amount:" + totalAmount); } }

11. 在finally块中对资源进行释放

应该大家都有过这样的经历,windows系统桌面如果打开太多文件或者系统软件,就会觉得电脑很卡。当然,我们linux服务器也一样,平时操作文件,或者数据库连接,IO资源流如果没关闭,那么这个IO资源就会被它占着,这样别人就没有办法用了,这就造成资源浪费。

我们操作完文件资源,需要在在finally块中对资源进行释放。

FileInputStream fdIn = null; try { fdIn = new FileInputStream(new File("/公众号_捡田螺的小男孩.txt")); } catch (FileNotFoundException e) { log.error(e); } catch (IOException e) { log.error(e); }finally { try { if (fdIn != null) { fdIn.close(); } } catch (IOException e) { log.error(e); } }

12.把日志打印好

日常开发中,一定需要把日志打印好。比如:你实现转账业务,转个几百万,然后转失败了,接着客户投诉,然后你还没有打印到日志,想想那种水深火热的困境下,你却毫无办法。。。

一般情况,方法入参、出参需要打印日志,异常的时候,也要打印日志等等,如下:

public void transfer(TransferDTO transferDTO){ log.info("invoke tranfer begin"); //打印入参 log.info("invoke tranfer,paramters:{}",transferDTO); try { res= transferService.transfer(transferDTO); }catch(Exception e){ log.error("transfer fail,account:{}", transferDTO.getAccount()) log.error("transfer fail,exception:{}",e); } log.info("invoke tranfer end"); }

之前写过一篇打印日志的15个建议,大家可以看看哈:工作总结!日志打印的15个建议

13. 考虑异常,处理好异常

优秀的后端开发,应当考虑到异常,并做好异常处理。田螺哥给大家提了10个异常处理的建议:

  • 尽量不要使用e.printStackTrace(),而是使用log打印。因为e.printStackTrace()语句可能会导致内存占满。

  • catch住异常时,建议打印出具体的exception,利于更好定位问题

  • 不要用一个Exception捕捉所有可能的异常

  • 记得使用finally关闭流资源或者直接使用try-with-resource。

  • 捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类

  • 捕获到的异常,不能忽略它,至少打点日志吧

  • 注意异常对你的代码层次结构的侵染

  • 自定义封装异常,不要丢弃原始异常的信息Throwable cause

  • 运行时异常RuntimeException ,不应该通过catch的方式来处理,而是先预检查,比如:NullPointerException处理

  • 注意异常匹配的顺序,优先捕获具体的异常

14. 考虑系统、接口的兼容性

优秀的后端开发,会考虑系统、接口的兼容性。

如果修改了对外旧接口,但是却不做兼容。这个问题可能比较严重,甚至会直接导致系统发版失败的。新手程序员很容易犯这个错误哦~

​

因此,如果你的需求是在原来接口上修改,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口,原本是只接收A,B参数,现在你加了一个参数C,就可以考虑这样处理:

//老接口 void oldService(A,B){ //兼容新接口,传个null代替C newService(A,B,null); } //新接口,暂时不能删掉老接口,需要做兼容。 void newService(A,B,C){ ... }

15. 采取措施避免运行时错误

优秀的后端开发,应该在编写代码阶段,就采取措施,避免运行时错误,如数组边界溢出,被零整除,空指针等运行时错误。类似代码比较常见:

String name = list.get(1).getName(); //list可能越界,因为不一定有2个元素哈

所以,应该采取措施,预防一下数组边界溢出,正例如下:

if(CollectionsUtil.isNotEmpty(list)&& list.size()>1){ String name = list.get(1).getName(); }

原文:优秀后端都应该具备的开发好习惯

深入浅出:.sh文件在Linux系统中的实战应用与技巧 本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。 阅读详情

相关推荐

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2217

Java后端开发要到什么水平才算合格?

一、后端开发基础知识掌握如何? 作为应届生,想要找-份后端开发的工作,那在去找工作前,你应该先对自身的能力进行- -次评估。 首先,你要回想一下自己的专业基础知识掌握得如何? 就拿javase举个例子,在javase中最 重要的就是面向对象的理解,多线程的使用,反射的理解,数据结构的使用等,对于我上述所提到的这些,题主是否都理解、掌握了呢? 作为应届毕业生,可能企业不会期望你进到公司就可以做项目,但是一些后端开发所会涉及的基础知识肯定是需要你具备的。因此对自身的能力进行评估,不但可以帮助你进行查漏

java9875的博客 2137

万象RK3506-EG1800网关使用说明

摘要:HD-RK3506-EG1800是一款高性能工业物联网边缘计算网关,支持Buildroot和Ubuntu双系统。文档详细介绍了网关的网络配置(包括ETH0/ETH1的静态IP设置、WiFi连接)、时钟同步、HSL软件安装配置(含开机自启动服务)、系统日志优化以及刷机操作指南(Loader/Maskrom模式)。特别提供了基于lighttpd的网页管理方案,通过HTML界面实现网络参数可视化配置,包含身份验证、实时状态显示和表单提交功能。网关默认ETH0固定IP为192.168.1.10,提供完整的CL

tian_jiangnan的博客 175

优秀后端都应该具备的开发好习惯

很多小伙伴,判断一个list}这样写呢,逻辑是没什么问题的。}日常开发中,我们既要会用工具类,更要学会自己去总结工具类。比如去文件处理工具类、日期处理工具类等等。这些都是优秀后端开发的一些好习惯。

LoveSummer 2万+

AI风控系统中的实时决策架构:架构师的关键设计

当用户点击「确认支付」时,一场毫秒级的“欺诈攻防战”正在后台悄然打响:系统需要在100ms内完成用户行为特征提取→欺诈模型推理→规则引擎校验→最终决策返回。这就是AI风控实时决策架构的核心——用技术对抗“实时化的欺诈手段”。本文将以「餐厅智能点餐系统」为类比,拆解实时风控架构的每一层逻辑:从“如何快速拿到用户的实时行为特征”(像服务员实时收集顾客的忌口),到“如何让模型和规则协同决策”(像厨师长结合菜谱和经验判断菜能不能做),再到“如何保证系统扛住大促的高并发”(像餐厅加桌子应对客流高峰)。我们会用。

2502_91592937的博客 1475

CPU性能优化实战:寄存器重命名如何解决指令冲突(附3种实现方案对比)

本文深入解析了CPU性能优化中的关键技术——寄存器重命名,详细阐述了其如何通过物理寄存器堆(PRF)和重命名映射表(RAT)解决WAW、WAR、RAW等指令冲突,从而释放超标量处理器的并行潜力。文章重点对比了基于ROB、ARF扩展和统一PRF三种主流实现方案的设计权衡、电路代价与功耗影响,并探讨了现代处理器中并行重命名与状态恢复的实战机制。

weixin_29252171的博客 268

【java】优秀后端都应该具备的开发好习惯

记录一下一个优秀的后端开发程序员,应该有哪些好的开发习惯。这样写呢,逻辑是没什么问题的。日常开发中,我们既要会用工具类,更要学会自己去总结工具类。比如去文件处理工具类、日期处理工具类等等。这些都是优秀后端开发的一些好习惯。以上是梳理的15点开发好习惯,希望对大家有帮助!一起加油!!!!

DreamSun的博客 735

中兴SDH设备开局及业务配置

中兴SDH设备开局及业务配置 1.设备开局(S200-----S325) A.开电之后,按住截铃(bell off)开关,直至NCP告警灯变成橙色; B.此时,设备进入Download状态,设备IP为:192.192.192.11/24; 2.用交叉线(568A)将设备的QX口连接至电脑,电脑配置和设备相同网段的IP信息; 3.在电脑上测试连通性:pin...

weixin_33897722的博客 3998

优秀后端都应该具备的开发好习惯!

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 247

DenseNet训练实践

在Cifar10上训练DenseNet,复现DenseNet论文的结果是后面两篇分析工作的基础,因此本系列的第一篇,将首先讨论深度学习的训练过程中的几个方面: 1. 数据集 1.1 Cifar10数据集 Cifar10数据集有6万张32X32的图片,是一个小型的数据集,但数据的复杂度足够,下图来自DenseNet论文,可以看出,不用数据增强的话,ResNet的正确率也很难超过90%,因而足以用来验...

一蓑烟雨任平生 1万+

CKA-题库-简洁参考答案-反复练习20遍-必过!!!

新版CKA考试已于2020年9月1日正式上线! 考试模式:线上考试 考试时间:2小时 认证有效期:3年 软件版本:Kubernetes v1.19 重考政策:可接受1次重考 经验水平:中級 题目数量:17题 题库量小:随机的题目重复率极高 考试时可打开两个浏览器Tab,一个是考试窗口,一个用来查阅官方文档](https://kubernetes.io/docs/) 01 Task - 英文 Create a new ClusterRole named deployment-clusterrole tha.

随笔记录-分享&记忆 7318

程序员必备的6个好习惯,成为更优秀的自己

养成这6个习惯,你也能成为编程老司机。

龙叔的博客 7977

2026.4.15:超详细自动安装Ubuntu-Server的保姆级教程

这篇教程详细介绍了如何创建无人值守的Ubuntu Server 26.04自动安装镜像。主要内容包括:从安装镜像中提取autoinstall-user-data文件并修改为user-data配置文件;使用mkpasswd生成加密密码;通过软碟通工具修改ISO镜像,添加自动安装所需的user-data和meta-data文件;编辑grub.cfg引导文件以启用自动安装模式。教程提供了完整的yaml配置示例,包含网络、存储、用户等设置,并演示了最终制作完成的自动安装镜像效果。

拥抱具身智能,昇腾Ascend C 750

优秀的后端应该有哪些开发习惯?

本篇文章简单介绍我日常开发的习惯,当然仅是作者自己的见解。暂时只想到这几点,以后发现其他的会更新。

weixin_42907150的博客 1006

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

后端开发怎么做得更优秀?记住这15个好习惯

15个好习惯帮你更好的掌握后端开发~~

weixin_53919192的博客 1662

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

高薪前端都应该具备的开发好习惯

格拉德威尔曾提出过一个“一万小时定律”,即任何人从平凡到大师的必要条件,就是历经1万小时的锤炼,而这“1万小时”也不是达到就行;如何构成,才是能否成为行业资深的关键。总结起来,就是四个字:多看+多练+刻意练习,那具体怎么做才可以完成这“1万小时”的锤炼?优秀的Web开发人员工作效率更高,因为他们拥有丰富的经验和良好的习惯。工作多年,我有一些自己了解的习惯分享给大家,都曾让我受益,希望接下来的分享可以让您的工作事半功倍。

JNPF 专注低代码开发 1034

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

优秀的后端 Java 开发应该有哪些好的开发习惯?

毕业快三年了,前后也待过几家公司,碰到各种各样的同事。见识过各种各样的代码,优秀的、垃圾的、不堪入目的、看了想跑路的等等,所以这篇文章记录一下一个优秀的后端 Java 开发应该有哪些好的开发习惯。 拆分合理的目录结构 受传统的 MVC 模式影响,传统做法大多是几个固定的文件夹 controller、service、mapper、entity,然后无限制添加,到最后你就会发现一个 service 文件夹下面有几十上百个 Service 类,根本没法分清业务模块。正确的做法是在写 service 上层新建一

JAVA88866的博客 220

Web开发者需具备的8个好习惯

优秀的Web开发人员工作效率更高,因为他们拥有丰富的经验和良好的习惯。作者Gregor Dorfbauer分享了用于Web开发中的8个好习惯,这些良好的工作习惯不仅能提高效率,还能让您创建更加优秀的应用,让您的工作事半功倍。   1.  使用Bug追踪系统   想要做好软件开发并非易事,这里面还包含大量的功能需求、Bug报告以及用户反馈的内容都值得我们好好去摸索。也许有的时

思想上移,行动下移 1049
下一篇: 好用到爆的Restful API工具包插件,IDEA 版 Postman
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值