重构-读书笔记

《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

                比如:一个元素是名字,第二个是分数,就应该封装为对象。

猜你喜欢

转载自luckywnj.iteye.com/blog/2278015