发布时间: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.重构——更改方法签名
若您对提取出的方法名称、其参数设定、输出结果或相关修饰元素感到不甚满意,请勿直接通过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)为例,其难点在于能否准确理解并掌握关键要素。若能成功构建动态转移方程,那么解决这类问题通常就能顺利通过。 整个刷题实录内容,包括 双指针技术、动态规划策略、二分搜索法、贪心策略、深度优先遍历、字符串处理、递归方法、字典树结构、排序算法、链表数据结构。等相关专题内容。图文并茂,附有刷题答案源码。 他对知识点的阐述极其详尽,以贪心算法为例,其布局尤为精致; 目前上述内容已打包成完整电子书,具体获取方式如下:
点击下面公众号卡片,关注「编程技术精选」 公众号;
在「编程技术精选」公众号后台回复关键词「115」获取下载地址。
如有侵权请联系删除!
TAGS:
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码