网站首页 > 教程文章 正文
该篇文章参考了:
1. 阿里巴巴《java开发手册》v1.5.0 华山版
2. 《码出高效:Java开发手册》
单个方法的总行数不超过80行
在阿里巴巴《java开发手册》v1.5.0 华山版中第十一条
推荐单个方法的总行数不超过80行
为什么
推荐80行呢?还是除了注释之外的?80行随便写几个if、else 不就快80行了吗?
高内聚、低耦合
把相关的功能强内聚,把弱相关的功能拆解开来, 重新抽象、重新封装。是每个方法都都遵守单一职责原则。这样也有利于方法的复用。
魔数 3
心理学认为人对事物的印象通常不能超过3 这个魔法数, 三屏是人类短期记忆的极限,而80 行在一般显示器上是两屏半的代码量。
通过对阿里代码抽样调查显示, 只有不到5% 的方法才会超过80 行, 而这些方法通
常都有明显的优化空间。
如何重构、优化代码(压缩代码到80行)
虽然开发手册只是推荐级别,但不可否认的是:谁也不能忍受方法过长,比如1000行。假设现在公司确定下来规范,单方法不能超过80行或者100行或者120行,那么如何将长行数方法重构到这个数呢?
重构、抽象、封装
按照方法单一职责,一个方法只做一件事,封装单独的方法,把相关的功能强内聚,把弱相关的功能拆解开来,这样做有两个好处:
- 方便后面复用方法
- 方便编写单测
而对于封装方法时,涉及到方法的入参,通常会纠结参数的处理,拆分的方法间需要参数传递数据。
限制参数列表过长的方式有很多, 比如包装成类、隐式传递或放在集合中等。
如果不抽取、封装,一个变量可从方法第1行使用到第1000行,虽然不用考虑方法间用参数传递数据,
但是超过3屏,你大概率会忘了这个变量声明的意义
条件取反,减少代码缩进
方案一
// idList 可能为方法入参,也可为从数据库查询
if(!CollectionUtils.isEmpty(idList)){
for(String id : idList){
// do something
}
}
方案二
Assert.notEmpty(idList,"idList should not be empty");
if(CollectionUtils.isEmpty(idList)){
//throw new IllegalArgumentException("idList should not be empty");
return;
}
for(String id : idList){
// do something
}
对比两方案,方案二比方案一减少了一层代码缩进,同时在方案二中,若入参较多,且入参校验较多时,可单独提取公共方法。
卫语句 Guard clauses
如果条件语句极其复杂,就应该将条件语句拆解开,然后逐个检查,并在条件为真时立刻从函数中返回,这样的单独检查通常被称之为卫语句
设计模式
策略模式、状态模式
- 上一篇: 看完阿里的代码规范,立马学会代码分层,再也不会被同事怼
- 下一篇: 这篇代码规范及工具使用,全网火了
猜你喜欢
- 2024-12-12 人人都是程序员?百度、阿里同天向个人免费开放AI编码助手
- 2024-12-12 if-else嵌套太深?教你一个新手都能掌握的设计模式搞定!
- 2024-12-12 靠左神这套程序员代码面试指南入职阿里、腾讯、美团、百度不再难
- 2024-12-12 前端开发有哪些编码规范?
- 2024-12-12 阿里低代码框架 lowcode-engine 低代码表单实战
- 2024-12-12 阿里P9整理10w字内部并发编程手册,GitHub百万下载量
- 2024-12-12 阿里通义千问代码模型Qwen2.5-Coder全系列正式开源
- 2024-12-12 我入职阿里后,才知道原来简历这么写
- 2024-12-12 最全阿里P系列解读:P5—P8的技能要求和薪资结构
- 2024-12-12 阿里巴巴Java开发规范(4):日志规约
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)