IDEA 真牛逼,900 行"又臭又长"的类重构,几分钟搞定?真香!

从MVC到DDD的架构演进 DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步。本文从MVC架构角度来讲解如何演进到DDD架构。 从DDD的角度看MVC架构的问题 代码角度: 瘦实体模型:只起到数据类的作用,业务逻辑散落到service,可维护性越来越差; 面向数据库表编程,而非模型编程; 实体类之间的关系是复杂的网状结构,成为大泥球,牵一发而动全身,导致不敢轻易改代码; service类承接的所有的业务逻辑,越来越臃肿,很容 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:juejin.im/post/5e11dd736fb9a047f42e61ad

  • 答应我,别再写上千行的类了好吗?

  • 为什么类不能过长?

  • 我已经写了几千行了,怎么办?


答应我,别再写上千行的类了好吗?

最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性

如果你身边有一个类写上千行的猿,一定要把此文转给ta

为什么类不能过长?

类过长——读不通,扩展不通

  • 读不通——直接用滚轮滚都得好几秒,就算是原作者,时间长了恐怕也难以理清整个类,更不用说是其他的读者

  • 扩展不通——一个类有过多的接口,会让扩展这个类变得异常困难,一动千行

类过长——可能有冗余代码

此时CV工程师打了个冷战

冗余代码,就是重复代码,通常出自使用Ctrl+C,Ctrl+V来生产代码的CV工程师之手,冗余代码的危害非常大:

  1. 冗余代码使方法、类过长,不简洁

  2. 冗余代码会造成发散式修改(冗余代码需要变动时,每一处Ctrl+V都需要修改)

类过长——多半是职责过多

一个类开放几十个接口,绝对存在职责过多的问题,就像图中的Tom猫一样手忙脚乱,一个类的职责过多也有巨大问题:

  1. 违反设计原则——单一职责原则(单一职责原则要求一个类只实现一个职责,比如一只Tom只做扫地、擦桌、拖地中的一件事,而其他事的实现可以转移给史派克狗或肥胖女佣),违反了这个原则会导致发散式变化、发散式修改、类过长等代码问题,还会让你的类难以扩展,甚至会让其他程序猿认为你不专业

  2. 发散式变化(指引发此类修改的地方很多),如果一个类的职责很多,那它的扇入(调用者)一定很多,每个调用者的修改都有可能让你这个类不得不随之修改,也就是发散式变化

    就是说不管哪儿出了问题,你这个类都得遭殃

  3. 发散式修改(指此类修改引发修改的地方很多),相同的,如果一个类职责很多,那支撑它实现的下级,即扇出(被调用方)一定很多,如果此类逻辑发生变动,所有下级被调用者可能都得随之修改,也就是发散式修改

    就是说你这个类出了问题,不管哪儿都会遭殃

  4. 难以扩展:如果你的一个类接口非常多,那它的子类怎么办?它的包装类怎么办?难道全部都要实现这么多接口,全部都要承担同样多的职责吗?扩展起来真的非常麻烦

  5. 触发机关:【测试之怒】【运维之怒】

我已经写了几千行了,怎么办?

重构——抽取冗余代码

抽取冗余代码就是将重复代码抽取成一个独立的方法,之后再使用这段代码时就不再需要Ctrl + C,Ctrl + V,而是直接调用对应的方法即可

这样做也可以缩短原方法,使原方法更加简洁易懂

更值得一提的是如果这段代码需要修改,也只需修改一处,而不是发散式地到处修改

真是一箭三雕

使用IDEA进行冗余代码的抽取
  1. 找到重复代码

  2. 进行方法抽取 右键->选择重构->抽取->方法 (或者直接使用快捷键Ctrl + Alt + m)

    自动检测出个别重复代码的细微差别,有些代码可能只改动一两个变量,IDEA会自动检测出来,并在抽取方法时提醒我们,选择左侧Accept Signature Change(接受签名变动)可以使抽取的方法自动替换更多的重复点

    可以选择替换掉所有的重复代码(竟然有18处)

  3. 重构——更改方法签名

    如果你对抽取出的方法的名字、参数、返回值或是修饰符不满意,不要使用Ctrl + R 修改,IDEA提供了重构方法——更改签名(快捷键Ctrl + F6)

    注意:方法的名字指的是方法做了什么,而非怎么去做,最好是 动词+名词 格式

    比如:Tom.扫地() √

    Tom.扫地With扫把() ×

    Tom.用扫把扫地()      ×

重构——转移成员变量+函数(转移职责)

将不应该由自己管理的成员变量和函数转移出去

那就要考虑两个问题:该转移谁?转移给谁?

来看一个图

  1. 图中成员【偏A】被类【A】调用两次,而只被它所在的类【过长类】调用1次,因而应该转移给【A】去管理

  2. 由于函数【偏A】与成员【偏A】的亲密度较高(只调用了【偏A】),因而应与【偏A】共进退,同去留,转移给【A】

  3. 成员【偏B】和函数【偏B】也是相同道理

  4. 职责1(函数【1】和成员【偏职责1】)和职责2(函数【2】和成员【偏职责2】)由于找不到可转移的合适的类,所以应抽取出一个新的类

注意,先决定移动哪个成员变量,然后再决定移动哪个函数

使用IDEA转移成员变量和函数
  1. 移动成员变量,鼠标选择成员变量->右键->Refactor->Move,然后选择转移至哪个类

  2. 移动函数(与移动成员变量步骤相同)

重构——抽取类

当你发现要转移的成员变量和函数找不到合适的类时(转移职责却找不到下家),要想起来,这里是程序世界,而我们程序猿就是类和对象的造物主,是时候创建一个新的类,让它来替我们分担职责(成员变量和函数)了

使用IDEA抽取类
  1. 重构 选中要搬的成员变量和函数,右键->Refactor->Extract->Delegate(抽取一个委托者,委托他来管理这部分变量和函数,如果只有变量或只有函数,可以抽出参数对象Paramater Object或方法对象Method Object)

    不推荐抽取参数对象,因为一般参数对象是给参数多的方法用的(用参数对象取代一长溜的参数),而且如果成员变量抽取了也不会影响任何函数的话,那就是无用对象了,不如直接把他们删除掉

  2. 为新类起个名,选个包吧

  3. 注意,抽取的函数和成员一定要符合一个原则,那就是被抽取函数使用被抽取成员的次数一定高于剩余函数的次数,不然违反亲密性原则(成员应归于调用它最多的类,没有理由你用的比我多还让我来管理)

  4. 一些小问题

    由于抽取的函数直接使用了未抽取的对象而导致重构失败,涉及到另一个重构(使用get方法而非直接使用私有成员变量),使用此重构即可解决



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

答应我,别再写上千行的类了好吗 答应我,别再写上千行的类了好吗? 最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性 如果你身边有一个类写上千行的猿,一定要把此文转给ta 为什么类不能过长? 类过长——读不通,扩展不通 读不通——直接用滚轮滚都得好几... 阅读详情

相关推荐

第 4-2 课:反射和动态代理 + 面试题

反射 反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法。 反射的使用场景 在现实中反射的使用场景有很多,比如以下几个。 使用场景一:编程工具 IDEA 或 Eclipse 等,在写代码时会有代码(属性或方法名)提示,就是因为使用了反射。 使用场景二:很多知名的框架,为了让程序更优雅...

磊哥聊Java 678

一个方法几千行的程序是如何产生的?

最近查看公司的代码,发现有很多体积很大的类,其中一些方法竟有几千行。 这些方法有些共同的特点: 包含大量巨大的if else嵌套。 伴随着大量的magicnumber。 存在大量的重复代码。 难以测试。 对于任何一个没有足够业务知识的人,完全不可读。 这些代码成长过程都很相似: 第一个人:把业务流程和业务代码封装在一个类里。业务不复杂,代码看起来还行。 第二个人...

李黄河 1060

SQL手工注入及sqlmap注入(文章管理系统实例练习)

sql手工注入及sqlmap注入练习

weixin_53303754的博客 523

IDEA 代码行数很多时卡顿 已解决

最近在编辑一个两万多行的文件时出现严重卡顿, 内存都给了4g、缓存也清理了, 但还是卡, 折腾了一会随手检查了一个插件, 结果发现了问题。这个插件默认设置是100000行, 我给改成一万就不再卡顿了。

weixin_60783905的博客 3228

Diffusion、VAE与GAN:三大生成模型的原理对比与应用场景解析

本文深入解析了Diffusion、VAE与GAN三大生成模型的核心原理与特性。Diffusion模型通过逆向去噪过程实现高质量图像生成,但计算成本较高;VAE擅长学习概率潜空间,训练稳定但图像偏模糊;GAN通过对抗训练生成锐利图像,但存在模式崩溃风险。文章结合实战场景,为图像生成、修复、超分辨率等任务提供了清晰的模型选择指南。

weixin_29063979的博客 343

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1239

c++修改类成员变量的值_IDEA 真牛逼,900 行"又臭又长"的类重构,几分钟搞定?真香...

答应我,别再写上千行的类了好吗?为什么类不能过长?我已经写了几千行了,怎么办?答应我,别再写上千行的类了好吗?最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性如果你身边有一个类写上千行的猿,一定要把此文转给ta为什么类不能过长?类过...

weixin_33736666的博客 647

OpenClaw:深度学习驱动的智能编程工具实战解析

智能编程工具通过深度学习技术革新传统开发流程,其核心在于代码语义理解与实时协作能力。这类工具采用AI代码补全、错误预测等技术,显著降低开发者认知负荷,尤其适用于复杂业务逻辑开发和遗留系统维护场景。以OpenClaw为例,其智能填充和上下文感知功能可提升40%编码效率,减少65%调试时间。关键技术实现包含自然语言处理、代码静态分析等,在金融科技、电商系统等领域具有广泛应用前景。热词提示:代码理解引擎、智能工作流整合展现了当前AI辅助开发的最新趋势。

chubaisheng8627的博客 320

idea查看一个类的所有子类_IDEA 真牛逼,900 行"又臭又长"的类重构,几分钟搞定?真香!...

答应我,别再写上千行的类了好吗?为什么类不能过长?我已经写了几千行了,怎么办?《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体...

weixin_39614146的博客 155

Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作指南

本文详细介绍了Agilent N5230A矢量网络分析仪在射频器件S参数测试中的关键操作流程与技巧。内容涵盖从开机预热、校准(SOLT/ECal)、参数设置(频率、点数、功率、IFBW)到连接测量、数据保存分析的全过程,并分享了夹具去嵌入、时域分析等进阶功能与常见问题避坑指南,旨在帮助工程师获得精准可靠的散射参数测试结果。

kotlin6android的博客 401

SolidWorks与Python二次开发实战:从宏录制到自动化脚本

本文详细介绍了利用Python对SolidWorks进行二次开发的实战方法。通过宏录制获取操作指令,再将其转换为Python脚本,工程师可以高效实现建模、出图等重复任务的自动化,显著提升设计效率。文章涵盖了环境搭建、代码转换、调试技巧及完整实战案例,为工程师提供了从入门到精通的完整路径。

weixin_29082143的博客 947

idea抽取重复方法快捷键_IDEA 真牛逼,900 行"又臭又长"的类重构,几分钟搞定?真香!...

答应我,别再写上千行的类了好吗?为什么类不能过长?我已经写了几千行了,怎么办?《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体...

weixin_29784009的博客 390

详解大模型微调数据集构建方法(持续更新)

本文详细介绍了大模型微调数据集构建方法,希望能对学习大模型的同学们有所帮助。 文章目录 1. 前言 2. 微调数据集构建方法 2.1 方法一 2.2 方法二 2.3 方法三 2.4 方法四 2.5 方法五

herosunly的博客 28万+

idea怎么集成svn服务端_IDEA 真牛逼,900 行"又臭又长"的类重构,几分钟搞定?真香!(含IDEA教程)...

答应我,别再写上千行的类了好吗?最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性如果你身边有一个类写上千行的猿,一定要把此文转给ta为什么类不能过长?类过长——读不通,扩展不通读不通——直接用滚轮滚都得好几秒,就算是原作者,时间长了...

weixin_39690958的博客 100

3. LangGraph快速入门

本示例中,我们将使用 Claude Sonnet 4.5 模型,并定义加法、乘法、除法工具。# 定义工具@toolArgs:"""@toolArgs:"""@toolArgs:"""# 为大模型绑定工具图的状态用于存储消息和大模型调用次数。LangGraph 中的状态在整个智能体执行过程中保持持久化。使用带的Annotated类型可以确保新消息追加到现有列表,而不是替换列表。模型节点用于调用大模型,并决定是否调用工具。return {],

Long_像风一样自由 842

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

一切尽在掌控之中:这个Python脚本,让工作自动向你汇报进度!

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文I've learned that people will fo...

程序员小乐 1346

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

这12张手绘图,让我彻底搞懂了微服务架构!

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文I've learned that people will fo...

程序员小乐 1313

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最受欢迎Java数据库访问框架(DAO层)

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文I've learned that people will fo...

程序员小乐 2617

idea自动换行,设置每行代码长度 -阿里巴巴Java开发规范建议

选择File,选择Settings,搜索Code Style,点击Editor下的Code Style,修改:Hard wrap at 设置每行代码长度 columns,勾选Wrap on typing应该是自动换行的意思,ok

shuai的博客 2万+

单个Java 文件过大,idea 中显示 “J” 图标 解决办法

情景再现: 单个 类显示 “J” , 编译可以正常编译,没有受到影响, 但是Idea 却标红。 打开文件 后,发现最上面有一行 浅黄色的提示 原因找到了,文件有点大,idea设置的默认值小了。找到 idea 安装目录下的 bin/idea.properties。下面这个字段调大一些。 ...

纸上得来终觉浅,绝知此事要躬行 932

写代码过程中的冗余处理

冗余就是那些去掉冗余信息并不会影响整体信息完整性的地方。 比如,我们要存储一个四边形的内角角度信息,只需要存三个就可以了,因为第四个可以由前三个推出来,这第四个内角角度就属于冗余信息。 写代码时往往会遇到冗余,那么,我们什么时候应该保留冗余,什么时候应该去除冗余呢? 1、  冗余有好处吗?大部分情况下是没有的。 2、  冗余的好处主要体现在恢复数据和并发读取数据提高效率方面。 3、  冗

buyulian的博客 6099

代码冗余到底有没有好处?

1:总的来说没有好处,但是不可避免。 2:其实就我开发java程序来看,如果一开始需求比较完整,不容易写出很多冗余的代码,往往冗余的代码就是一开始设计不够好,或者需求不够完整造成的。 3:比如说我曾经做个一个系统,一开始是人工创建订单,调用订单接口,同时记录相关操作日志。 4:接着加了一个系统自动创建订单的功能,要求记录的操作日志和人工创建的有差异, 5:我

u010523770的专栏 8231
上一篇: Apollo 源码解析 —— Portal 配置灰度规则
下一篇: 一二线城市知名 IT 互联网公司名单!虎~
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值