重构Tips
一,重新组织函数
1.首先找出局部变量和参数.
1>任何不会被修改的变量都可以当作参数传入.
2.去掉临时变量Replace Temp with Query.用查询函数代替临时变量
3.Extract Method
难点:有局部变量依赖.(用方法返回值的方式去赋回值)
4.Inline Method内联函数(三段式)
5.Introduce Explaining Variable引入解释性变量,(和2相反)
6.Split Temporary Variable(分解临时变量:针对每次赋值,创造一个独立\对应的临时变量)
7.移除对参数的赋值(更明确,不会误解按引用传递和按值传递)
8.已函数对象取代函数(将这个函数放进一个独立对象中,如此依赖局部变量就变成了对象内的字段.然后就可以在同一个对象中将这个大型函数分解为多个小型函数)
二,在对象之间搬移特性
1,Move Method(有个函数与所驻类之外的另一个类有过多的交流,调用后者或呗后者调用.那么,在该函数最常引用的类中建立一个有着类似行为的新函数,将旧函数变成一个单纯的委托函数,或是将旧函数完全移出)
2,Move Field(搬移字段,某个字段被其所驻类之外的另一个类更多地用到)
3,Extract Class(提炼类,将相关的字段和函数从旧类搬移到新类)
4,隐藏"委托关系"(客户通过一个委托类去调用另一个对象)
5,引入外加函数(你需要为提供服务的类添加一个函数,但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例)
6,引入本地扩展(用继承或聚合的方式去做类扩展)
三,重新组织数据
1.自封装字段(为类字段建立getter/setter方法,并且只以这个函数访问字段)
2.以对象取代数据值(你有一个数据项,需要与其他数据和行为一起使用才有意义)
3.以字面量常量代替无意义数(宏定义或常量)
4,以子类取代类型码(类继承结构,多态)
5,用state(状态模式)/strategy(策略模式)代替类型码 ([都是用到多态的基本方式]状态模式:多个状态变换,将这些状态子类化,然后由一个state manager来管理这些状态[多态]; 策略模式:将不同算法分配到子类中去)
6,用字段取代子类(你的各个子类的唯一差别只在"返回常量数据"的函数身上,那么修改这些函数,使他们返回超类中的某个(新增)字段,然后销毁子类)[反多态.技巧,Replace Constructor with Factory Method用工厂方法将子类实例化的过程封装在工厂方法里,从而消除对子类的引用]
如:Peopele createMale(){return new Male();};
Peopele p = createMale();
四,简化函数调用
1.Separate Query from Modifer(将查询函数和修改函数分开,类的单一化设计)
2.Replace Parameter with Explicit Methods(以明确函数取代参数)
如:void setValue(String name,int value){if xxxx}
改为两个语义化且明确的方法名:
void setName(){};
void setValue(){};
3.引入参数对象(有利弊,会引入结构依赖)
4.以工厂函数取代构造函数
如:Peopele createMale(){return new Male();};
Peopele p = createMale();
参考资料:<重构:改善既有代码的设计>
最新文章
- Javascript实现时间转换为多少天前
- Android常用组件之AutoCompleteTextView
- c++ 类的静态变量
- HTTP2.0的二进制分帧
- Target:IG
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
- SharePoint 2013 Installation and Configuration Issues
- C#常用功能函数小结(.NET 4.5)
- yii2数据修改|联查
- win php nginx 配置小细节
- multiselect获取选中的多个下拉项的值(逗号分割的字符串)
- Linq XML
- Android 之 Window、WindowManager 与窗口管理
- hibernate---关联关系的 crud_cascade_fetch
- 2017计算机学科夏令营上机考试-C:岛屿面积
- Django 2.0 学习(03):Django视图和URL(下)
- 高斯消元(Gauss消元)
- Java核心技术及面试指南面试题,基本数据类型、封装类和运算操作的面试题
- erlang安装
- jQuery实时监听input的值变化(input的值产生变化才会触发事件)
热门文章
- unable to find resource &#39;xxx\xx\overview.vm&#39; in any resource loader.
- angular5 表单元素 checkbox radio 组讲解
- XML和Schema
- Java JDK5新特性-增强for
- [Java学习] Java继承的概念与实现
- Tree Cutting (Hard Version) CodeForces - 1118F2 (树形DP,计数)
- Three Pieces CodeForces - 1065D (BFS)
- CSS样式属性——背景
- spring-mvc---Controller参数绑定的类型
- @Resource与@Autowired注解的区别