重构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();
参考资料:<重构:改善既有代码的设计>
重构Tips的更多相关文章
- Isomorphic JavaScript: The Future of Web Apps(译)
Isomorp ...
- 重构(Refactoring)技巧读书笔记(General Refactoring Tips)
重构(Refactoring)技巧读书笔记 之一 General Refactoring Tips, Part 1 本文简要整理重构方法的读书笔记及个人在做Code Review过程中,对程序代码常用 ...
- 《重构》中Tips总结
1 如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地达到目的,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性. 2 重构之前,首先检查自己 ...
- 重构网页过程中的小tips
1.display为inline-block的元素可以使用virtical-align:middle来使得元素垂直居中对齐 2.在一些按钮标签或者mark标签中,如果文本内容确定不会改变长度的话,可以 ...
- 【转】40个良好用户界面Tips
一个良好的用户界面应具有高转换率,并且易于使用.但要用户体验良好并不容易做到,下面我们整理了40个良好用户界面Tips,希望能对你有帮助! 1 尽量使用单列而不是多列布局 单列布局能够让对全局有更好的 ...
- CSS代码重构与优化之路
作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...
- CSS代码重构
CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高 ...
- 10个加速Table Views开发的Tips(转)
本文由CocoaChina译者yake_099(博客)翻译,作者:David McGraw原文:10 Actionable Performance Tips To Speed Up Your Tabl ...
- 【前端】一步一步使用webpack+react+scss脚手架重构项目
前言 前几天做了一个项目:[node]记录项目的开始与完成——pipeline_kafka流式数据库管理项目:因为开发时间紧迫,浅略的使用了一下react,感觉这个ui库非常的符合我的口味,现在趁着有 ...
随机推荐
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
- 会员通过消费攒积分,升级RENEW以及降级的需求
需求看上去及其简单,如下: 用文字描述就开始不容易了. 先按等级排个序,根据下一个等级,推前一个等级: --C---B----V-----A 在计算一下升级需要的积分:--C表示普通会员-----需要 ...
- MongoDB(课时24 全文索引)
3.6.3 全文索引 在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是利用了某个字段上实现的模糊查询,但这个时候返回的信息并不会很准确,因为只能够查A字段或B字段,而在MongoDB里面实现 ...
- angular组件层次与军事指挥层级职责的联系
又继续读angular文档,发现自己之前理解还是有误.按官方文档的思路service不是属于component的,是属于module的.module才是负责完整领域逻辑的单位.demo的英雄编辑器给我 ...
- Shell循环输入符合条件为止
提供用户输入,直到输入d/D/r/R为止. #!/bin/bash ]; do echo -n "(D)ebug or (R)elease?" read select_build_ ...
- Codeforces 847B - Preparing for Merge Sort
847B - Preparing for Merge Sort 思路:前面的排序的最后一个一定大于后面的排序的最后一个.所以判断要不要开始新的排序只要拿当前值和上一个排序最后一个比较就可以了. 代码: ...
- android--------根据文件路径加载指定文件
Android根据指定的文件路径,加载该路径下指定文件格式(图片格式 png, gif,jpg jpeg)的文件相关信息的列表. 如图: public class MainActivity exten ...
- Confluence 6 的 Crowd 设置
名字(Name) 输入一个有意义的服务器名字,会让你在 Crowd 服务器中更好的识别你的目录服务器: Crowd Server Example Company Crowd 服务器URL(Server ...
- mysql 查询某一主键在那些表中中被设置为外键了
use information_schema; show tables; select * from KEY_COLUMN_USAGE where COLUMN_NAME='areaid';
- 安装docker CE for CentOS
Uninstall old versions sudo yum remove docker \ docker-client \ dock ...