你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

项目扩展遇类长 766 行!代码重构多重要,快转给身边猿友

发布时间:2025-07-10

浏览次数:0

点击上方“码农突围”,马上关注

这里是码农充电第一站,回复“666”,获取一份专属大礼包

真爱,请设置“星标”或点个“在看”

作者 | 围军儿

文章出处|来自掘金网站,链接为juejin.cn/post/6844904038383747086

在近期对现有项目进行拓展的过程中,我遭遇了一个棘手的问题:一个需要修改的类竟然有766行代码,并且开放了将近40个接口。完成这次修改的过程让我痛不欲生。为了避免类似的悲剧再次上演,我深感有必要撰写一篇博客,向广大程序员同仁传达代码重构的必要性。

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

为什么类不能过长?

类过长——读不通,扩展不通类过长——可能有冗余代码

此时CV工程师打了个冷战

冗余代码等同于代码中的重复部分,此类代码多由那些依赖复制粘贴操作的CV工程师所编写。这种代码带来的负面影响极其严重:

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

过多的代码会导致在需要进行调整时,每个需要修改的部分都需要重复操作(当冗余代码需要被修改时,每一次都必须进行Ctrl+V的复制粘贴操作)。

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

一个模块若开放了数十个接口,必然面临职责过载的困扰,就如同图中的汤姆猫那般手忙脚乱。此类情况下的一个类,若承担过多职责,同样会引发诸多问题。

违背了设计规范中的单一职责理念——即一个类应承担单一职责(例如,一只名为Tom的狗只负责扫地、擦桌或拖地中的某一项工作,而其他任务可以由史派克狗或体型丰满的女佣来承担),此行为将引发一系列问题,如代码的扩散性变更、修改的扩散性以及类定义过长等,同时,这也可能使得你的类难以进行扩展,甚至可能让其他开发者对你的专业水平产生质疑。

若一个类承担了众多职责,那么其依赖者(即调用者)的数量必然众多,而每一个调用者的改动都可能迫使该类不得不进行相应的调整,这种现象即称为发散式变化。

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

若一个类承担了众多职责,那么支撑其功能的下层组件,即那些被调用的子模块,必然数量众多。一旦此类模块的逻辑发生变动,所有依赖它的子模块或许都需要进行相应的调整,这种修改方式即称为发散式修改。

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

若一个类接口数量庞大,那么它的子类和包装类将面临何种境遇?难道它们都需要一一实现这些接口,并承担等量的责任?这样的扩展过程无疑极为繁琐。

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

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

重构——抽取冗余代码

提取多余代码意味着将重复出现的代码块转化为一个独立函数,之后在需要使用该代码时,只需直接调用该函数,无需再进行复制粘贴操作。

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

特别要强调的是,若对这段代码进行改动,仅需针对单一位置进行调整,无需在多处进行发散式的修改。

真是一箭三雕。

使用IDEA进行冗余代码的抽取

1.找到重复代码

在执行方法提取操作时,请右击目标,然后从重构选项中选择“抽取方法”,亦可通过快捷键Ctrl + Alt + m直接进行。

IDEA能够精准识别出代码中细微的重复差异,即便某些代码仅对个别变量进行了微调,它也能自动识别并提示。在提取方法的过程中,若选择左侧的(接受签名变动)选项,所抽取的方法便能自动替换掉更多的重复部分。

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

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

类过长问题_intellij idea怎么样_代码重构重要性

若您对提取出的方法名称、其参数设定、输出结果或相关修饰元素感到不甚满意,请勿直接通过Ctrl + R快捷键进行修改。IDEA软件为您提供了另一种重构手段——即通过修改签名功能(快捷键Ctrl + F6)来实现。

方法名称应反映其功能,而非操作过程,建议采用动词加名词的结构。

比如:Tom.扫地() √

Tom.扫地With扫把() ×

Tom.用扫把扫地() ×

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

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

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

来看一个图

图中该成员【偏A】受到了【A】类的两次调用,相较之下,仅被其所属的【过长类】调用了一次,因此建议将管理权移交给【A】类。

鉴于函数【偏A】与成员【偏A】的关联性较强(主要依赖【偏A】),因此应当与【偏A】保持一致,无论是前进还是后退,都应一同考虑,最终将其转交给【A】。

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

职责一涉及函数【1】及成员【偏职责1】,职责二则包括函数【2】及成员【偏职责2】,鉴于难以寻觅到适宜转移的恰当类,因此有必要提炼出一个全新的类别。

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

使用IDEA转移成员变量和函数

将成员变量进行位置调整,首先用鼠标点击该变量,接着在弹出的右键菜单中选择“移动”,最后指定目标类进行转移。

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

重构——抽取类

若你在寻找转移成员变量与函数时遭遇了合适的类难觅(即责任转移却苦无归属),不妨回想,身处程序之境intellij idea怎么样,我们程序员,乃是类与对象的创造者,此刻正是时候,着手构建一个新类,让它来承担我们的部分职责(即成员变量与函数)。

使用IDEA抽取类

1.重构

选择目标成员变量与函数,随后点击右键,进行操作选择箭头intellij idea怎么样,进而选择创建一个委托者,让其负责管理这些变量和函数。若仅涉及变量或仅涉及函数,则可选择提取参数对象或方法对象。

不建议提取参数对象,因为通常参数对象是为了简化参数众多的方法而设计的(通过参数对象替代一系列参数),再者,若提取的成员变量对任何函数都没有影响,那么这样的对象就变得没有意义,不如直接将其删除。

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

3.注意

所选取的函数及其成员必须遵循一条准则,即调用被选取成员的函数频率必须超过其他函数,否则便违背了亲密性原则(成员应当归属至调用频率最高的类,岂能是你用得比我多却让我来负责管理)。

4.一些小问题

因为重构过程中直接引用了未被提取的对象,导致重构未能成功实施,这一问题可以通过实施另一种重构策略(即采用获取方法而非直接访问私有成员变量)来得到解决。



近期,许多朋友在后台留言表达愿望,希望能够进入知名企业,然而普遍反映算法基础较弱。为此,我精心整理了一套刷题资料,这套资料不仅让我成功进入了我梦寐以求的大公司,现决定将其公开与大家共享,期望它能对各位有所助益。

算法题目,与撰写文章相似,也存在一些可借鉴的模板。以面试中常见的动态规划(DP)为例,其难点在于能否准确理解并掌握关键要素。若能成功构建动态转移方程,那么解决这类问题通常就能顺利通过。

整个刷题实录内容,包括 双指针技术、动态规划策略、二分搜索法、贪心策略、深度优先遍历、字符串处理、递归方法、字典树结构、排序算法、链表数据结构。等相关专题内容。图文并茂,附有刷题答案源码。

他对知识点的阐述极其详尽,以贪心算法为例,其布局尤为精致;


目前上述内容已打包成完整电子书,具体获取方式如下:
  1. 点击下面公众号卡片,关注编程技术精选 公众号;

  2. 在「编程技术精选公众号后台回复关键词「115」获取下载地址。

如有侵权请联系删除!

13262879759

微信二维码