使用 IDEA 几分钟就重构了同事800 行"又臭又长" 的类!真香!

在 idea中将重复的代码加入模块中 在 idea中将重复的代码加入模块中在 idea中将重复的代码加入模块中在 idea中将重复的代码加入模块中 立即下载

来源:http://suo.im/6fsMvG


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

“

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

实际项目中,真的不建议类过长以及职责过多,非常不友好!!!

另外,我在经历了几个项目之后,发现大部分情况下一个类一般是不会太长的,除非是这个类职责太多,再或者说自己没有抽取相应的逻辑/工具类方法。

我觉得我们写代码不光是要把功能实现,还一定要对代码的质量比如可读性有较高要求。检验你的代码可读性与否很简单,就是随便拉一个稍微懂点业务的开发过来看你的代码,看看别人能不能很快就看懂。

我当时自己写简单的 RPC 框架的时候,大部分时间实际都花在了方法的命名、类的拆分和包的拆分这三件事情上。

还有一点我印象比较深的是:好的代码尽量是不需要注释,通过名字就能看清意思。 但是,我在经历了几个项目之后发现,这点真的对开发有太高要求,很难保证,特别是在没有 Code Review 的时候。

团队成员之前达成一个共识很重要!!!

一下子扯了这么多题外话,都是有感而发,我们开始正菜吧!

为什么类不能过长?

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

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

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

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

“

此时 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 方法而非直接使用私有成员变量),使用此重构即可解决。


END
开关电源环路学习笔记(1)-为啥要知道传递函数? 做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V 阅读详情

相关推荐

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 465

IDEA中抽取相同多重复的代码成为一个函数

IDEA中抽取相同多重复的代码成为一个函数

ros275229的博客 1859

深入理解DQN中的Q值:核心概念和应用

在强化学习中,Q值(或称为动作价值函数)是核心概念之一。Q值函数 ( Q(s, a) ) 表示在给定状态 ( s ) 下,采取动作 ( a ) 并遵循某策略后,智能体从当前状态到未来状态所能获得的预期总回报。简言之,Q值是评估特定状态和动作对的好坏的指标。

qlkaicx的博客 2978

代码重构坏味道——Duplicated Code (重复代码)思考

表现:相同的代码逻辑存在多个函数(类)中,如果需要修改逻辑,需要修改所有重复的地方。缺点:需要修改多个地方,容易出现遗漏。修改影响范围广,经常无法准确评估需要涉及需要修改的点是否对其他业务有影响。

庄的博客 984

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 672

BookSim2.0 教程

本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛

更新一些计算机体系架构NoC,GEM5, AXI4,还有machine learning 的日常 5737

IDEA 重复代码快速重构(抽取重复代码快捷键)

IDEA 重复代码快速重构(抽取重复代码快捷键)

m0_52767002的博客 3512

到底是什么决定了二极管的最高工作频率?

硬件工程师,应该都用过二极管的吧,不过也许有一个误区,大多数人可能并不知道,或者说是理解有问题,下面就来细细说下。 一个问题 先提一个问题:到底是什么决定了二极管的最高工作频率? 估计有不少人会回答是二极管反向恢复时间Trr,也有人会说是二极管结电容,那到底谁是对的呢?或者说都一样,反向恢复时间由结电容决定? 到底什么决定了二极管的最高工作频率,我们暂且不论,不过需要知道的是,二极管的反向恢复时间和结电容根本就是两回事,反向恢复时间绝不能等同于结电容的充放电时间。 为什么我这么说呢?.

weixin_42005993的博客 4834

IDEA学习篇 —— 将相同的代码抽取成方法

需求:在我们代码里面可能存在相同的代码。这时候IDEA会提示:Found duplicated code in this file 意思是:代码中有重复的部分。 这时候我们就可以将重复的部分抽取成方法了。 快捷键:CTRL + ALT + M...

Coder编程的博客 1万+

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3010

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1194

使用 IDEA 几分钟就重构了同事800行"又臭又长" 的类!真香!

橙味菌|https://sourl.cn/gvFv33最近在对已有项目进行扩展的时候,发现要改动的一个类它长 766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为...

singwhatiwanna 322

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1207

使用 IDEA 几分钟就重构了同事800 行“又臭又长“ 的类!真香!

最近在对已有项目进行扩展的时候,发现要改动的一个类它长 766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性 “ 如果你身边有一个类写上千行的猿,一定要把此文转给 ta 实际项目中,真的不建议类过长以及职责过多,非常不友好!!! 另外,我在经历了几个项目之后,发现大部分情况下一个类一般是不会太长的,除非是这个类职责太多,再或者说自己没有抽取相应的逻辑/工具类方法。 我觉得我们写代码不光

程序员白楠楠的博客 362

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用 IDEA 几分钟就重构了同事800 行“又臭又长“ 的类。真香

最近在对已有项目进行扩展的时候,发现要改动的一个类它长766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性 “ 如果你身边有一个类写上千行的猿,一定要把此文转给 ta 实际项目中,真的不建议类过长以及职责过多,非常不友好!!! 另外,Guide 在经历了几个项目之后,发现大部分情况下一个类一般是不会太长的,除非是这个类职责太多,再或者说自己没有抽取相应的逻辑/工具类方法。 .

代码界的扛把子 205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行"又臭又长" 的类!真香定律...

最近在对已有项目进行扩展的时候,发现要改动的一个类它长766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性。如果你身边有一个类写上千行的猿,一定要把此文转给 ta实际项目中,真的不建议类过长以及职责过多,非常不友好!!!另外,Guide 在经历了几个项目之后,发现大部...

weixin_35781693的博客 528

idea 查看一个类的子类_使用 IDEA 几分钟就重构了同事800 行"又臭又长" 的类!真香!...

来自:掘金,作者:围军儿链接:https://juejin.im/post/5e11dd736fb9a047f42e61ad最近在对已有项目进行扩展的时候,发现要改动的一个类它长766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性“如果你身边有一个类写上千行的猿,一...

weixin_39926104的博客 85

idea抽取重复方法快捷键_使用 IDEA 几分钟就重构了同事800 行"又臭又长" 的类!真香!...

最近在对已有项目进行扩展的时候,发现要改动的一个类它长 766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性“如果你身边有一个类写上千行的猿,一定要把此文转给 ta实际项目中,真的不建议类过长以及职责过多,非常不友好!!!另外,我在经历了几个项目之后,发现大部分情况下一个类一般是...

weixin_34536193的博客 293

idea抽取重复方法快捷键_使用 IDEA自带功能几分钟就重构了同事800 行"又臭又长" 的类!真香!...

最近在对已有项目进行扩展的时候,发现要改动的一个类它长766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性“如果你身边有一个类写上千行的猿,一定要把此文转给 ta实际项目中,真的不建议类过长以及职责过多,非常不友好!!!另外,我在经历了几个项目之后,发现大部分情况下一...

weixin_36354492的博客 251

idea差一个方法被谁调用了快捷键_使用 IDEA自带功能几分钟就重构了同事800 行"又臭又长" 的类!真香!...

最近在对已有项目进行扩展的时候,发现要改动的一个类它长766 行,开放了近 40 个 public 接口,我流着泪把它给改完了。为了防止这样的惨剧再次发生在我的身上,我觉得有必要写一篇博客来让广大程序猿同胞知道代码重构的重要性“如果你身边有一个类写上千行的猿,一定要把此文转给 ta实际项目中,真的不建议类过长以及职责过多,非常不友好!!!另外,我在经历了几个项目之后,发现大部分情况下一...

weixin_39544101的博客 163
上一篇: Java8 快速实现List转map 、分组、过滤等操作
下一篇: MySQL当中的 “My” 是什么意思?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值