文章目录

  • 一、前言
  • 二、总结
  • 三、脑图

一、前言

我们总是说自己的项目历史代码太多,是个屎山。自己也深度思考过这个问题,什么样的代码才能定义为屎山(不能怪业务太复杂吧)?到底是自己理解能力不行还是确实代码写的烂(肯定不愿意都是自己的问题)?或者说自己写的代码其实也是屎山,不理解只是因为一坨屎不认识另一坨屎罢了,这很正常(亲生经历过这种场景)。
“我本可以忍受黑暗,如果我未曾见过光明”,看到好代码,内心是愉悦的(特别是写好代码的人天天和自己一起吃饭,只能感慨——牛哇牛哇)说不出具体好的逻辑,但内心就觉得这个是好东西(应该是编码的细节)。知道了什么是好,什么是不好,想深挖屎山的底层逻辑,于是我开始求助于前人的智慧。

《重构》一书以代码重构为背景,传授重构代码的方法论为目的,向我们展示了代码的坏味道以及代码重构的方法,以及部分作者对于重构的思考。书中很多方法在我看来比较中性(到了代码设计层面),比如一个字段应该是共通属性还是子类独有的特点,这十分考验开发人员对于这个世界的理解,我认为这一类的方法会随着我们开发年限的增长,会逐渐形成自己专属的方法论。并且有的中性方法,在我看来是都可以的,具体使用哪种方法得联系业务场景的上下文,而非单纯的根据Demo代码就能给出结果。

二、总结

虽然整体的功能代码设计需要站在业务场景的角度上进行理解,可是这些细节的编码却总是充斥在代码的角角落落。一屋不扫何以扫天下。特别是在我这接近半年的代码治理工作中,对书中的一些细节感触颇深,特此做一个记录:

1、过长函数:编码中要善于提炼小函数,通过对小函数的复用或者流程编排,达到面向对象的效果。遇到想写注释,那就是可以抽取为函数的信号,这是面向过程和面向对象的最显著的区别;
2、过大的类:表示一个类的功能太多,可以将类的功能拆分为两个不同功能单一的类;
3、过长参数列:可以使用一个对象将参数进行封装;
4、依恋情结:方法应该按照能力向外提供,外部调用也只能操作能力,而不是去操作细节,否则就是进入了面向过程的领域。编写方法时,明确当前方法是业务的流程编排,还是领域暴露能力的具体实现,前者关注能力,后者关注实现细节;
5、基本类型偏执:对于某些天然存在组合的数据,可以使用结构化对象进行存放。如开始时间和结束时间,可以使用一个结构话对象表示,而不是使用两个基本数据类型;
6、switch惊悚现身:出现switch、if…else的时候,需要联想到多台和策略的抽象来替换;
7、纯稚的数据类:类比DDD思想,尽可能的让我们的数据类也能拥有行为;
8、过多的注释:注释应该用来描述“为什么做某事”,而不是做了某事;
9、引入解释性变量:类比使用boolean变量,对复杂的表达式结果进行记录。如果该表达式结果存在被复用的可能性,尽可能还是抽取一个方法,引入方法能在整个类中使用,而一个变量只能在方法内部作用;
10、以字面量取代魔法数:创建一个常量,根据意义进行命名,并将上述的字面数值替换为这个常量。而不是直接使用魔法值写在判断中,因为此时的判定(如1或者2)并不知道其具体的业务含义,只能在代码上看到这是不同的流程;
11、封装集合:返回该集合的一个只读副本,并在这个类中提供添加/移除方法。针对get获取到的集合数据,任何修改都不能影响到原集合的数据,即修改副本。如果要修改原来集合的数据,那么只能依靠原来类暴露出现的add/remove方法;
12、以数据类取代记录:不要出现没有结构的数据,如数组、map,需要使用一个结构化的对象存储数据,即使这个对象只有数据,没有任何行为;
13、移除控制标记:在一长串的业务逻辑判定中,使用break、continue或return替代控制标记。而不是先根据逻辑给一个变量赋值,然后再根据变量的不同情况走向不同的逻辑;
14、引入断言:它应该总是true,可以在代码调试阶段快速定位到错误,以及帮助阅读;
15、将查询函数和修改函数分离:保证方法的职责单一,不要同时具备查询和修改的动作。含有两个动作的方法有很强的副作用性,需要将方法进行拆分为两个职责单一的方法。这里的副作用也是我们在代码编写中需要重点注意的;
16、隐藏函数:函数的访问权限一定要规定好,这在重构的时候会有大作用;
17、以测试取代异常:面对调用者可以预先检查的条件,而不是在业务逻辑中再去检查条件。

感触最深的莫过于下面的这几点,这些场景可以说是相当高频:
‒ (1)过长的函数
‒ (3)过长的参数列表
‒ (8)过多的注释
‒ (10)以字面量取代魔法数
‒ (12)以数据类取代记录
‒ (13)移除控制标记
‒ (15)将查询函数和修改函数分离
‒ (16)隐藏函数

《阿里巴巴Java开发规范》视为经典,软件设计原则张嘴就来,面向对象特性更是有手就行,可是我们真的理解了吗,还是我们只是嘴上说说罢了?今天的我认为,我将一直走在理解的路上,且永远到不了终点

三、脑图

《重构:改善既有代码的设计》读书笔记相关推荐

  1. 读书笔记 | 墨菲定律

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  2. 读书笔记 | 墨菲定律(一)

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  3. 洛克菲勒的38封信pdf下载_《洛克菲勒写给孩子的38封信》读书笔记

    <洛克菲勒写给孩子的38封信>读书笔记 洛克菲勒写给孩子的38封信 第1封信:起点不决定终点 人人生而平等,但这种平等是权利与法律意义上的平等,与经济和文化优势无关 第2封信:运气靠策划 ...

  4. 股神大家了解多少?深度剖析股神巴菲特

    股神巴菲特是金融界里的传奇,大家是否都对股神巴菲特感兴趣呢?大家对股神了解多少?小编最近在QR社区发现了<阿尔法狗与巴菲特>,里面记载了许多股神巴菲特的人生经历,今天小编简单说一说关于股神 ...

  5. 2014巴菲特股东大会及巴菲特创业分享

     沃伦·巴菲特,这位传奇人物.在美国,巴菲特被称为"先知".在中国,他更多的被喻为"股神",巴菲特在11岁时第一次购买股票以来,白手起家缔造了一个千亿规模的 ...

  6. 《成为沃伦·巴菲特》笔记与感想

    本文首发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明-- 沃伦·巴菲特传记的纪录片 http://www.bilibili.co ...

  7. 读书笔记002:托尼.巴赞之快速阅读

    读书笔记002:托尼.巴赞之快速阅读 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<快速阅读>之后,我们就可以可以快速提高阅读速度,保持并改善理解嗯嗯管理,通过增进了解眼睛和大脑功能 ...

  8. 读书笔记001:托尼.巴赞之开动大脑

    读书笔记001:托尼.巴赞之开动大脑 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<开动大脑>之后,我们就可以对我们的大脑有更多的了解:大脑可以进行比我们预期多得多的工作:我们可以最 ...

  9. 读书笔记003:托尼.巴赞之思维导图

    读书笔记003:托尼.巴赞之思维导图 托尼.巴赞的<思维导图>一书,详细的介绍了思维发展的新概念--放射性思维:如何利用思维导图实施你的放射性思维,实现你的创造性思维,从而给出一种深刻的智 ...

  10. 产品读书《滚雪球:巴菲特和他的财富人生》

    作者简介 艾丽斯.施罗德,曾经担任世界知名投行摩根士丹利的董事总经理,因为撰写研究报告与巴菲特相识.业务上的往来使得施罗德有更多的机会与巴菲特亲密接触,她不仅是巴菲特别的忘年交,她也是第一个向巴菲特建 ...

最新文章

  1. python安装scipy
  2. 新手应该如何有效地学习.net
  3. 【新星计划】汽车纵向动力学模型
  4. html中的expand属性,expand的用法总结大全
  5. java file取不到linux文件_Java中高级核心知识全面解析——Linux基本命令(切换、增删改查、压缩文件、权限命令)...
  6. WEB前端 屏蔽移动端浏览器页面顶部提示 此网页由网站提供
  7. 前端学习(130):HTML和CSS发展历史
  8. ajax的模式_AJAX的完整形式是什么?
  9. Mac下python3配置Sklearn
  10. java 并发原子性与易变性 来自thinking in java4 21.3.3
  11. 2020年中级数据库系统工程师考试时间表与考试大纲
  12. Python请求webserver服务用到的suds、suds-jurko、zeep库相关踩坑指南
  13. 物联网技术实现农业自动化
  14. 《mysql从删库到跑路》下载
  15. 在计算机领域做研究的一些想法(转)
  16. 入职快两个月的一些感悟
  17. LogicFlow 来绘制兼容 BPMN2.0 规范的流程 (React hooks版)
  18. 【广告架构day1】爱奇艺广告系统的演进之路:实践中的一些经验
  19. win10远程桌面连接ubuntu20(RDP)
  20. 普通话水平测试软件异错词,最新普通话水平测试易错词语

热门文章

  1. EXCEL通俗易懂讲公式(一):sumif,sumifs,countif,countifs
  2. 带你了解AWP产品家族
  3. 基于深度学习的花卉识别
  4. php 字符串 两边空格,php怎么去除字符串两边的空格?
  5. 2022年19款不能错过的 Google Chrome影图类工具插件
  6. c语言中item用法,CCtrlList::InsertItem()的用法
  7. 新华教育集团常务副总裁许绍兵荣获“2017-2018全球华人教育领军人物”的称号。
  8. 限制同一IP访问次数,csrf,分页,Paginator,内建用户系统,文件上传,上传到本地
  9. 基于SpringBoot的车牌识别系统(附源码和环境部署文档)
  10. 腾讯会议的最新调整说明