点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达

今日推荐:网传互联网公司加班表

个人原创+1博客:点击前往,查看更多

作者:橙味菌链接:https://juejin.im/post/5e11dd736fb9a047f42e61ad

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

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

为什么类不能过长?


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

读不通——直接用滚轮滚都得好几秒,就算是原作者,时间长了恐怕也难以理清整个类,更不用说是其他的读者扩展不通——一个类有过多的接口,会让扩展这个类变得异常困难,一动千行

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

此时CV工程师打了个冷战

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

冗余代码使方法、类过长,不简洁冗余代码会造成发散式修改(冗余代码需要变动时,每一处Ctrl+V都需要修改)

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

![](data:;base64,<?xml version=)" src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8c4a3038ef?imageView2/0/w/1280/h/960/ignore-error/1" />

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

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

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

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

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

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

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

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

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


重构——抽取冗余代码

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

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

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

真是一箭三雕

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

找到重复代码


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

![](data:;base64,<?xml version=)" src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8e2544fe59?imageView2/0/w/1280/h/960/ignore-error/1" />![](data:;base64,<?xml version=)" src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8e7cf3c668?imageView2/0/w/1280/h/960/ignore-error/1" />

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


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


重构——更改方法签名

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

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

比如:Tom.扫地() √

Tom.扫地With扫把() ×

Tom.用扫把扫地() ×

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

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

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

来看一个图


图中成员【偏A】被类【A】调用两次,而只被它所在的类【过长类】调用1次,因而应该转移给【A】去管理由于函数【偏A】与成员【偏A】的亲密度较高(只调用了【偏A】),因而应与【偏A】共进退,同去留,转移给【A】成员【偏B】和函数【偏B】也是相同道理职责1(函数【1】和成员【偏职责1】)和职责2(函数【2】和成员【偏职责2】)由于找不到可转移的合适的类,所以应抽取出一个新的类

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

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

移动成员变量,鼠标选择成员变量->右键->Refactor->Move,然后选择转移至哪个类

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

重构——抽取类

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

使用IDEA抽取类

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

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


为新类起个名,选个包吧


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

一些小问题

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


最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了腾讯等大厂offer,拿去不谢,github 地址:https://github.com/OUYANGSIHAI/JavaInterview

这么辛苦总结,给个star好不好。 点击阅读原文,直达

idea抽取重复方法快捷键_IDEA 真牛逼,900行 quot;又臭又长quot; 的类重构,几分钟搞定...相关推荐

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

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

  2. Python真牛逼,获取压缩文件密码,我只要一分钟!

    事情的经过是这样的: 又是奶茶,行吧行吧. 快点开工,争取李大伟回来之前搞定. 李大伟说是6位数字密码 那么我们可以利用python生成全部的六位数字密码 这样,我们就生成了一个从000000到999 ...

  3. 制作点击文字变颜色_手机照片、视频怎样添加文字?原来很简单,4种方法一分钟搞定...

    手机照片.视频怎样添加文字?原来很简单,4种方法一分钟搞定 还有3天就到了元旦佳节,相信大家都很开心,美好的假期开始了. 那么可以说是你们元旦必备手机技巧,怎样给照片.视频添加文字,分享4种笔者常用的 ...

  4. php文字转语音amr,如何将文字转成语音?这几个方法一分钟搞定!

    原标题:如何将文字转成语音?这几个方法一分钟搞定! 文字转语音在我们的生活中已经广泛使用了,早晨起床想要看看新闻,但是又无奈时间不够,这时不必慌张,想要了解新闻事件,我们直接把这些文字转为语音,随时随 ...

  5. Latex中自动引用参考文献的方法,一分钟搞定

    Latex中自动引用参考文献的方法,一分钟搞定 平时在写英文paper的时候经常要在IEEE上引用文献,一个个手敲引用信息又太麻烦,vol pp 作者 时间什么的balabala一大堆,latex用常 ...

  6. 去除重复内容,就用这个EXCEL公式,1分钟搞定!(数组公式返回不重复的值,不适用透视表的情况下)

    去除重复内容,就用这个EXCEL公式,1分钟搞定! 一份高中录取名册中,上千条学生信息,生源校有七八十所,如何从表中轻松提取出不重复的生源校名单呢? 有人或许会这样做:复制录取名册中所有生源校到一个空 ...

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:juejin.im/post/5e11dd736fb9a04 ...

  8. IDEA真牛逼,900行又臭又长的类重构,几分钟搞定

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:橙味菌 https://juejin.im/post/5e1 ...

  9. IDEA 真牛逼,900行 又臭又长 的类重构,几分钟搞定

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:网传互联网公司加班表个人原创+1博客:点击前往,查看更多作者:橙味菌 链接:https://juejin.im/ ...

最新文章

  1. Golang 并发concurrency
  2. Linux数据报文接收发送总结4
  3. jQuery滑动效果实例
  4. golang配置export GOPRIVATE拉取私有库代码
  5. 利用js对table动态增加和删除行(附带table样式,鼠标滑过和点击样式)
  6. 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
  7. Oracle教程之oracle 给用户授权
  8. mysql error nr.2003_[MySQL]在安装windows版MySQL时遇到过如下问题Error Nr.1045和Error.Nr.2003,相应解决办法如下...
  9. php 网站移动端自适应,HTML5 移动端自适应布局
  10. Java字符串indexOf(int ch,int fromIndex)方法,带示例
  11. 技术专题:厦门9月30日限制路由(网络尖冰),WAYOS或ROS解决方案
  12. “机海战术”已死!后智能手机时代靠什么才能赢?
  13. 前端笔记----jquery入门知识点总结 (转)
  14. 黑马程序员——java基础---IO(input output)流字符流
  15. GDAL被java调用 Cannot find proj.db
  16. layui表单验证xmselect必填
  17. 联想笔记本e43l_联想昭阳e43l
  18. 自制StartUp宏病毒专杀小工具
  19. 【逗老师的无线电】宝峰神机刷OpenGD77摇身变为DMR大热点
  20. BAT批处理判断是否是文件夹,是则遍历

热门文章

  1. 商业智能BI如何推进制造业转型
  2. 数据可视化系统在哪些行业中应用
  3. 南开大学计算机学院夏令营,2022保研夏令营:南开大学计算机学院云端夏令营通知...
  4. vue可编辑div_Vue实现MakeDown编辑器
  5. tcp socket编程 java_JAVA TCP Socket编程 计算题
  6. java session机制_如何学习Session的机制使用
  7. Android程序中回调的讲解和使用
  8. Vivaldi浏览增加百度搜索引擎
  9. PIE SDK矢量点生成等值线、面
  10. 重大改革!Python将被加入高考科目!