代码开发规范和常识

一、前言

第一次用这么大的标题,怪不好意思的,总结一下,我在开发代码初期遇到的常识问题和习惯问题吧。

二、正文

  1. 命名要有意义:避免使用不具意义的变量名(如 abclist),应该根据上下文选择能够表达其含义的命名。命名清晰的代码有助于后续的阅读和维护。
  2. 代码格式化:统一的代码格式对于团队协作至关重要。对你写的代码使用工具(MAC 如 IntelliJ IDEA 的 command + option + L)进行格式化,可以保持一致性,减少格式问题影响代码质量。
  3. 不要随意改动他人代码:除非你明确理解并需要修改他人的代码,否则不要随便改变。理解他人代码的逻辑是防止引入新问题的基础,后面代码出事故了,就找你兜底了。。。。,然后上面那个格式化,强调了是对选中的格式化!!!
  4. 删除未使用的类或代码:提交前,检查自己写的类和方法是否有用,如果没有使用到,应该删除掉,避免代码冗余。
  5. 避免不必要的代码逻辑变动:在提交之前,检查自己修改的代码,确保没有误改他人逻辑。工具如 IDE 中的比较视图,可以帮助快速识别差异。
  6. git 代码比较:通过 Git 查看红色(删除的部分)和绿色(新增的部分)区域,确保自己提交的修改内容符合预期。
  7. NPE(NullPointerException)处理:在调用对象的方法或属性时,要考虑可能的 null 情况。可以使用工具类进行 null 检查,或者利用 Optional 类型。
  8. 避免 get(0) 造成 NPE:如果操作集合时直接访问 get(0),可能出现 NPE。建议先检查集合是否为空,或者使用更安全的方法,如 isEmpty()
  9. 方法内的 NPE 处理:每个方法的进入点都要做 null 检查,避免因 null 引发异常。可以使用断言、Optional 或自定义的工具方法来加强鲁棒性。
  10. 工具类中的 NPE 处理:当使用工具类时,也要注意其内部是否有适当的 null 处理。例如,EmailUtils 中如果没有做好 null 检查,可能会导致后续的问题。
  11. 调用命名规范:外部调用时使用 client 比如说 openfeign,rpc,内部调用时使用 api 就是前端界面可以直接调用出发。这样有助于区分外部和内部服务调用的不同角色和职责。
  12. 异常日志记录:e.printStackTrace() 不应该用于生产环境的异常记录。应该使用 log.error() 打印更详细的日志信息,包括异常类型、堆栈信息以及相关上下文。
  13. 命名规范:遵循阿里巴巴的命名规范,动词用作布尔值命名(如 isDelete),传递参数时使用名词。这样可以让代码更符合常规的命名习惯,减少误解。
  14. 服务调用失败时处理:服务调用失败的原因可能有很多种,例如网络问题、服务器故障等。返回时尽量封装异常信息,避免暴露过多细节。
  15. lambda 和 builder 使用:lambda 和 builder 是简化代码和提高可读性的有力工具。掌握这两种技术能够让你编写更加优雅和高效的代码
  16. 服务间通信返回值封装:在服务调用时,返回值使用对象封装可以提高扩展性和可维护性,避免直接返回基础类型,讲人话就是使用大对象包括各种属性。
  17. 自审代码:在提交前,假装自己是 code reviewer,检查代码的正确性、规范性和可读性。这可以帮助你发现很多自己写代码时忽略的细节,重点可以看看是不是哪里填写错了,哪里填写反了,或者是是不是又改了
  18. Maven 问题的处理:遇到 Maven 配置问题时,不要直接在其他项目中复制解决方案。应该通过 Git 回滚或查看历史记录来恢复到正确的状态,要不然一堆 change
  19. 测试覆盖率:测试覆盖率有些是触发不了的,有可能是 “前辈” 遗留的代码,如果总是 case 走不到,可以向有经验的同事请求
  20. 测试平台:测试平台也可以进行测试,然后可能是针对不同模块不同测试环境,记得看清楚你的项目是哪个模块,部署在哪个环境
  21. CURL:在 network 上捕获请求,右击可以复制 curl,apifox 支持导入,导入之后就可以直接模拟测试环境请求了,可以查看测试环境传的是什么参数
  22. 开源精神:学会写文档进行分享,一个好的文档是应该跨职业跨小组跨公司的。

三、后言

可能 gpt 味有点重,本人创作之后,喂给 gpt 进行修改了。后续也会把原文贴出来。这些是我开发初期遇到的问题,刚刚好整理下,希望自己以后牢记这些知识。同时也希望自己这篇博客能够给更多刚刚接触企业级开发的同学参考,可以少打回几次代码。

四、未润版

1 代码要顾名思义,不要 a,b,c,list(由于代码问题,前期可能有些前辈也是这么写的,别学)

2 代码要讲究格式,怕格式不对的,喂给 gpt,帮忙,也可以选择你要格式化的地方(这是重点)然后 command+optional+L

3 不是自己写的地方,代码不要改,原因就是事故追责原因,所以我强调要选择要格式化的地方,即只格式化你写的代码就行

4 自己创建的类,后面 ideal 提交,可以自己查看下,有没有用到,没有用到就要删掉,不要提交

5 不要改变无意间的改变别人的代码逻辑,在自己 psuh 之前,先查看提交区有哪些进行了改变,注意 ideal 左边是之前的代码,右边是自己现在的代码。还有啥建议吗

6 git 仓库查看代码,红色代码区域是之前代码,绿色代码区域是自己新提交的修改

7 在使用对象.getXXX,或者是使用一个对象的属性和方法的时候,要先想想 NPE 的处理

8 尽量不要使用 get (0), 也容易出现 NPE 的情况

9 每一个方法的进入处理都要考虑 NPE 处理

10 使用工具类的时候,也要查看内部是否进行 NPE 处理比如说 EmailUtils,就可能会出现 NPE 的情况

11 外部调用命名为 client,内部调用命名规范为 api

12 try。。catch。。finally,的日志不可以打成 e.printStackTrace ();, 要用 log.error (提示符做到哪里了,xxx 参数,e)

13 代码格式就看阿里巴巴命名规范吧,动词可以用 isDelete,如果只是传参作为判断的用名词

14 本服务调用 a 服务,如果返回失败,实际上是无法给出准确原因给值的,因为除了逻辑问题,也有可能会因为网络波动或者是服务器自身状态问题

15 公司用 lambda 和 builder 很多,可以看下怎么用,实在不行 gpt 进行描述

16 本服务调用 b 服务的时候,b 服务返回值,要用对象进行封装返回,其原因是服装性,修改代码地方少

17 在提交的时候,要自己先过一遍,假装自己是 reviewer,你会发现很多问题的

18 在写代码的时候,要先看看你在哪个分支上进行修改的

19 你的 maven 有问题了,你不可以无脑在某个项目上 copy,可以通过 git 代码进行回滚或者是使用 ideal 的历史记录进行修改

#牛客激励计划#
全部评论
学到了
1 回复 分享
发布于 2024-12-19 17:23 河南

相关推荐

总结:面了十几分钟,问的八股我准备的不是很好,有点尴尬通用问题1.有了解我们宁银消金吗2.你父母的职业3.你未来的打算4.你是网络安全专业,以后会从事这个方向吗5.问了去单位实习的内容6.你gap一年是在备考吗7.你有做过后端开发项目吗,为什么要来后端开发呢八股1.Spring前后端的参数传递方式有哪些一共有五种方式。第一种是路径传参,可以直接通过url传参@GETMapping("/users/{id})public User getUser(PathVaraiable("id") Long userId)将id绑定到userId上用途:标识唯一资源(用户ID,订单号等等)第二种是查询参数QueryParameters通过URL的?key=value传入,用于筛选数据可以传递附加条件(筛选,排序,分页等等)public String getUsers(RequestParam("name") String name,RequestParam (age) int age)第三种是请求体传参(@RequestBody)@RequestBody可以将JSON格式绑定到JSON对象上第四种是表单参数(Form Parameters)使用Request Param支持url编码和form-data(可以文件上传)主要用于POST/PUT请求会隐藏在请求体中,是不可见的第五种是请求头参数,通过HTTP请求传递信息(如认证令牌)实现方式:使用@RequestHeader注解来绑定信息)@GetMapping("/auth")public String checkAuth(@RequestHeader("Authorization") String token) {// 验证token}2.抽象类和抽象接口有了解吗抽象类定义 多个相关类有共同属性和部分共享逻辑,就可以抽象出一个抽象类抽象接口定义 声明一组无关类需实现的能力(例如Comparable定义比较规则)它可以实现多继承效果面试官​:抽象类和接口的区别是什么?​回答​:​核心目的不同​:抽象类为相关类提供通用模板(is-a),接口定义行为规范(can-do)。​代码灵活性​:抽象类支持部分方法实现,接口通过默认方法向后兼容。​继承机制​:抽象类单继承,接口多实现,适用不同扩展需求。​选择依据​:用抽象类:多个类共享状态和部分行为(如动物类族)。用接口:定义跨类能力(如序列化、比较)或实现多态3.面向对象的五大原则面向对象的五大设计原则(SOLID)是构建可维护、可扩展软件的核心准则,以下是具体解析及实践要点:📌 一、单一职责原则(SRP, Single Responsibility Principle)核心思想 :一个类只应有一个引起变化的原因。● 作用 :避免职责扩散导致的高耦合。例如,职员类若同时处理工程师、销售、经理的职责,会导致方法内充斥条件判断,任何需求变更都可能影响整体。● 实践建议 :按功能拆分模块。如图片加载框架中,将图片加载与缓存分离为两个独立类。🔄 二、开放封闭原则(OCP, Open-Closed Principle)核心思想 :对扩展开放,对修改封闭。● 作用 :通过抽象隔离变化。例如银行业务中,通过IBankProcess接口定义流程,新增基金业务只需扩展FundProcess类,无需修改原有代码。● 实现方式 : 使用策略模式(Strategy)或模板方法模式(Template Method)。○依赖抽象接口而非具体实现。🔁 三、里氏替换原则(LSP, Liskov Substitution Principle)核心思想 :子类必须能替换父类且不影响程序正确性。● 作用 :确保继承关系的合理性。反例:正方形继承长方形时,若修改setWidth()会同时改变高度,破坏行为一致性。● 关键点 : 子类方法的前置条件不能比父类更严格,后置条件不能更宽松。○避免重写父类非抽象方法。🧩 四、接口隔离原则(ISP, Interface Segregation Principle)核心思想 :客户端不应依赖其不需要的接口。● 作用 :避免“臃肿接口”。例如电商订单系统,为门户(查询)、外部系统(插入)、后台(全功能)分别定义专用接口。● 实践建议 : 按角色拆分接口,如IOrderForPortal仅含getOrder()。○避免强制实现无关方法,减少依赖污染。⬇️ 五、依赖倒置原则(DIP, Dependency Inversion Principle)核心思想 :1.高层模块不依赖低层模块,二者依赖抽象;2.抽象不依赖细节,细节依赖抽象。● 作用 :解耦模块关系。如图片框架中,业务逻辑依赖ImageCache抽象接口,而非具体的内存或本地缓存实现类。● 实现方式 : 依赖注入(DI)或工厂模式。
点赞 评论 收藏
分享
评论
8
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务