《Refactoring Improving the design of existing code》--Martin Fowler
chapter-1
例子1:根据不同类型电影,租期长短,计算价格,并输出。写到一个方法了。
可能变化:增加/改变输出样式,电影类型分类可能会变,计费标准会变。
只有优秀的人才能写出人易读的代码。机器永远会理解。
方法/变量名称,是代码清晰的关键。
方法应该放在,它使用的数据所属对象内,这样依赖低。
2,一个电影可以在生命周期内修改分类,一个对象却不能修复所属类。
不能创建电影子类,但可以创建价格子类。replace type with state/strategy,
把type相关行为移到state/strategy内部。
模式取决于:state:代表电影的某个状态,strategy代表计费策略。反映对结构的想法。
面向对象:思考对象的职责。
重构随时随地。
事不过三,三则重构。
重构可以取代预先设计。
switch少用,switch意味着重复。
间接层/方法:价值大于代价(易读复用)才有必要存在。
重复是万恶之源
chapter-6
6.1 extract method 以它“做什么”命令,不是怎么做。
6.4 replace temp with query 。临时变量尽量用final修饰。
double getPrice(){return getBasePrice * discountFactor();}
6.5 introduce explaining variable 解释性变量
boolean isMacOs = platform.indexOf("MAC") > -1;
if( isMacOs && isIEBrower){...}
chapter-7
如果一个类承担太多责任,考虑extract class,如果太鸡肋,考虑inline class
chapter-8
状态码
不变、且行为相同,不用抽取。比如性别男女。
不变、行为不同,抽取子类。
可变,生命周期内可变、或其他原因不能继承,使用state/stratege模式
chapter-9简化方法调用
查询、修改方法分离。getTotalAndSetSum()-->getTotal(),setSum();
参数超过4个时,使用对象封装参数。
工厂方法:根据类型码,提供一组类的,对象构造方式。接口简单统一。
如果有向下转型的代码,首先考虑是否可以用模板类代替。
组合:子类不需要父类的很多操作和接口。接口不能反映子类的功能,意图混淆。
继承:需要使用受delegation的类的所有方法,则改为继承。
类内部field自我封装:直接使用变量,直到它带来麻烦为止,自我封装是方便子类覆盖。
replace data value with object 把电话号码抽取成对象,因为有格式化,抽取区号,登方法
new Customer(1).store(),new Customer(2).store(),store(){list.add(this);}
多个order对应同一个customer,应该只对象改为引用对象,使用工厂
引用对象回提高难度
数组,集合,只应用于一组类似对象,如果不是使用包装对象替换,replace array with object
比如:一个元素是名字,第二个是分数,就应该封装为对象。