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

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

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

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

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

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


http://www.taodudu.cc/news/show-1750030.html

相关文章:

  • 腾讯面试题:如何实现一个类似新浪微博的短链接服务!
  • 惊呆了!JDK1.8竟然打破了我对接口的一切认知...
  • Hibernate 与 Mybatis 如何共存?打破你的认知!
  • Oracle用户可要顶住了:准备好大规模补丁工作!以修补多达 433 个的新安全漏洞...
  • Mybatis trim 标签的 2 个妙用!
  • 震惊!Redis 的字符串居然是这样实现的…
  • 别在网上乱找代码了,找了一段代码突然爆了!!!
  • 看图说话,FastJson 并没有那么流行!
  • GitLab 内置了 CI/CD 工具,强大啊!!
  • 推荐:Windows平台上三款提高工作效率的免费神器!
  • 怒爬某 Hub 资源就为撸了一个鉴黄平台
  • 被Redis击穿的一次面试经历
  • 彻底搞懂“红黑树”......
  • 我们公司不会用分布式事务!
  • 看看华为 Java 编程的军规...
  • 我的天!你竟然没有在SpringBoot中使用过异步请求和异步调用...
  • Spring Cloud 微服务下的权限解决方案
  • DataGrip 上手体验,真香!
  • 又整理了一批可以拿去做副业的开源项目...
  • 为什么我劝你放弃了Restful API?
  • 因为一条SQL,我差点被祭天......
  • 40+ 张最全 Linux / C / C++ 思维导图,收藏!
  • 权威!盘点 100 个最受欢迎的 Java 库!绝对经典
  • 一起围观下我们CTO写的代码,巧妙使用枚举干掉if-else!
  • 要注意了!这样使用MyBatis框架,被攻击了!
  • 曲线救国:提高github下载速度到2MB/s
  • Spring Boot 2.3.3 正式发布!2.4.0 正式版即将发布!
  • 日志框架选型,Logback 还是 Log4j2?
  • SpringBoot项目优雅的http客户端工具,太香了!
  • 知乎高赞:当update修改数据与原数据相同时会再次执行吗?

同事1000行又臭又长 的类!被我用IDEA几分钟重构!真香!相关推荐

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

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

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

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

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

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

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

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

  5. 如何重构千行“又臭又长”的类,IntelliJ IDEA 几分钟搞定!

    来源:juejin.cn/post/6844904038383747086 最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流着泪把它给改完了.为了防 ...

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

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

  7. c语言1000行代码,【图片】【标题党】论我是如何一分钟写1000行代码的【c语言吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # /* BOOST_PP_INC */ # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MW ...

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

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

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

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

  10. 让你少写 1000 行代码的正则全攻略来了!

    说起正则表达式,相信大家都不陌生.在很多程序员的认知中,这东西并不难,在工作中用的也不多,每次用的时候去 Google 搜一搜,然后复制过来改一改,问题就解决了,看起来效率特别高,好像完全没必要专门花 ...

最新文章

  1. 高性能MySQL(第3版)
  2. Rhel7 IPV6配置
  3. VMware vCenter Converter 关闭SSL加密,提高35-40%性能
  4. LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)
  5. android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析
  6. 笔记本CPU和显卡的选择标准
  7. 解决电脑双网卡不能同时连接内网和外网的问题
  8. 003_Kubernetes核心技术
  9. win7开机rpc服务器不可用进不了系统,win7系统提示rpc服务器不可用怎么解决
  10. 如何由网址查找IP地址
  11. 服务器sas接口怎么接sata硬盘吗,常识问答:SAS接口硬盘如何才能在SATA接口的主板上用...
  12. 【​观察】 娃娃也能编程?微软“编程一小时”让你家娃也能变身编程达人
  13. 打造类手机刷机的win10 recovery镜像
  14. the info.plist in the package must contain the CFBundleShortVersionString key.
  15. MySQL批量导入Excel数据
  16. 关于lego-loam的总结(一)
  17. 3B大战续集,你亲谁?
  18. UVA - 12627 Erratic Expansion(分治)
  19. 无线433发送接收数据测试程序原理,有杂波解决方案
  20. 收集的seo优化的些基础知识

热门文章

  1. iphone在jsp显示时间会NAN解决办法
  2. Dynamsoft WebAssembly条形码SDK预览
  3. android应用安全——数据安全
  4. android的wake_lock介绍
  5. PHP中的unset的使用问题
  6. 「leetcode」93.复原IP地址【回溯算法】详解!
  7. poj Cow Exhibition 01背包的灵活运用
  8. inDesign教程,如何创建灵活的标头设计?
  9. FCPX安装插件位置及删除插件的方法
  10. 想要轻松制作GIF图片,来看篇超全面的分析!