《重构:改善既有代码的设计(第2版)》 ePUBw.COM 47个笔记
这些注释之所以存在乃是因为代码很糟糕
注释
不要虚情假意地糊弄继承体系,应该运用以委托取代子类
拒绝支持超类的接口,这就难以接受了
Refused Bequest
这种结果数据对象有一个关键的特征:它是不可修改的
纯数据类
Alternative Classes with Different Interfaces
Large Class
以委托取代子类(381)或以委托取代超类(399)让它离开继承体系
如果两个模块有共同的兴趣,可以尝试再新建一个模块,把这些共用的数据放在一个管理良好的地方;或者用隐藏委托关系(189),把另一个模块变成两者的中介。
Insider Trading
某个类的接口有一半的函数都委托给其他类,这样就是过度运用
Middle Man
如果还有许多客户端代码需要访问链上的其他对象,同样添加一个函数来完成此事。
先观察消息链最终得到的对象是用来干什么的,看看能否以提炼函数(106)把使用该对象的代码提炼到一个独立的函数中,再运用搬移函数(198)把这个函数推入消息链
Message Chains
使用引入特例(289)在“变量不合法”的情况下创建一个替代对象,从而避免写出条件式代码
使用提炼类(182)给这个可怜的孤儿创造一个家,然后用搬移函数(198)把所有和这些字段相关的代码都放进这个新家
临时字段
夸夸其谈通用性
冗赘的元素
以管道取代循环
循环语句
重复的switch
基本类型偏执
一个函数跟另一个模块中的函数或者数据交流格外频繁,远胜于在自己所处模块内部的交流
数据泥团
依恋情结
霰弹式修改
拆分
发散式变化
使用以查询取代派生变量
确保调用者不会调到有副作用的代码
将查询函数和修改函数分离
提炼函数
移动语句
拆分变量
封装变量
如果要更新一个数据结构,就返回一份新的数据副本,旧的数据仍保持不变。
函数式编程
2023/7/24 发表想法 React 源码也是啊
从代码库的任何一个角落都可以修改它
全局数据
过长参数列表
过长函数
重复代码
◆ 第3章 代码的坏味道
神秘命名