使用Android Studio对代码进行重构
简介
2013年Google I/O大会上,谷歌推出新的Android开发环境——Android Studio,从此Android程序员有了新的选择,使用Android Studio进行App开发。AndroidStudio是一项全新的基于IntelliJ IDEA的Android开发环境。类似于Eclipse ADT插件,现在已经成为了官方推荐的ide,同时Eclipse不再进行更新。
软件开发中,经过几个版本迭代,不少程序员会觉的以前的代码架构可能不满足日益增长的需求,这时候都会想到了重构,关于重构网上也有不少用于的资料。
资料里面列举了如下几种方法,对代码进行重构。
31天重构学习笔记01. 封装集合
31天重构学习笔记02. 移动方法
31天重构学习笔记03. 提升方法
31天重构学习笔记04. 降低方法
31天重构学习笔记05. 提升字段
31天重构学习笔记06. 降低字段
31天重构学习笔记07. 重命名(方法,类,参数)
31天重构学习笔记08. 使用委派代替继承
31天重构学习笔记09. 提取接口
31天重构学习笔记10. 提取方法
31天重构学习笔记11. 使用策略类
31天重构学习笔记12. 分解依赖
31天重构学习笔记13. 提取方法对象
31天重构学习笔记14. 分离职责
31天重构学习笔记15. 移除重复内容
31天重构学习笔记16. 封装条件
31天重构学习笔记17. 提取父类
31天重构学习笔记18. 使用条件判断代替异常
31天重构学习笔记19. 提取工厂类
31天重构学习笔记20. 提取子类
31天重构学习笔记21. 合并继承
31天重构学习笔记22. 分解方法
31天重构学习笔记23. 引入参数对象
31天重构学习笔记24. 分解复杂判断
31天重构学习笔记25. 引入契约式设计
31天重构学习笔记26. 避免双重否定
31天重构学习笔记27. 去除上帝类
31天重构学习笔记28. 为布尔方法命名
31天重构学习笔记29. 去除中间人对象
31天重构学习笔记30. 尽快返回
31天重构学习笔记31. 使用多态代替条件判断
Android Studio是基于优秀的ide的,ide提供了丰富的功能,很方便的对代码进行重构,下图是我的Android Studio Refactor菜单,部分快捷键与默认快捷键不同是因为方便而修改的。
古人云『工欲善其事必先利其器』,所以在对代码进行重构前,需要详细了解Android Studio提供的功能,下面对AS(Android Studio,后面简称AS)菜单进行简单示例。
如何使用
鼠标光标选中或者放在代码上,按下快捷键就可以弹出当前代码可以使用的功能。
如下所示:
代码与操作示例
- ChangeSignature,改变函数签名,可以修改函数的名字,参数的顺序,参数的名字。
Before:
// 改变签名
void testChangeSignature(int second, int first) {
System.out.println(first + "->" + second);
}
Gif:
After:
// 改变签名
void testChangeSignature(int one, int two) {
System.out.println(one + "->" + two);
}
修改前参数依次是second、first,修改是one、two。
- ChangeClassSignatuere,改变类的签名,可以修改类的泛型签名
Before:
// 改变类的签名
void testChangeClassSignatuere() {
String second = "second";
int first = 100;
new ChangeClassSignatuere(second, first);
}
// **********************分割线*******************************
public class ChangeClassSignatuere {
private int first;
private String second;
public ChangeClassSignatuere(String second, int first) {
this.first = first;
this.second = second;
}
@Override
public String toString() {
return "ChangeClassSignatuere{" +
"second='" + second + '\'' +
",first=" + first +
'}';
}
}
Gif:
After:
// 改变类的签名
void testChangeClassSignatuere() {
String second = "second";
int first = 100;
new ChangeClassSignatuere<Activity>(second, first);
}
// **********************分割线*******************************
public class ChangeClassSignatuere<A> {
private int first;
private String second;
public ChangeClassSignatuere(String second, int first) {
this.first = first;
this.second = second;
}
@Override
public String toString() {
return "ChangeClassSignatuere{" +
"second='" + second + '\'' +
",first=" + first +
'}';
}
}
- 修改匿名类为内部类
Before:
// 匿名类改成内部类
void testConvertAnonymousToInner() {
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("onClick");
}
};
}
Gif:
After:
// 匿名类改成内部类
void testConvertAnonymousToInner() {
View.OnClickListener clickListener = new Abc123();
}
private static class Abc123 implements View.OnClickListener {
@Override
public void onClick(View v) {
System.out.println("onClick");
}
}
这个是我最喜欢的一个功能,有时候匿名类刚刚开始逻辑很简单,过不了多久逻辑太多,就可以使用快捷键变成一个内部类。
- ConvertToInstanceMethod,修改一个方法变成成员方法
Befor:
// 变成成员方法
void testConvertToInstanceMethod() {
TestClass.convertToInstanceMethod(this, "test");
}
public class TestClass {
static void convertToInstanceMethod(RefactorDemo demo, String string) {
System.out.println("convertToInstanceMethod = " + demo);
System.out.println("convertToInstanceMethod = " + string);
}
}
After:
// 变成成员方法
void testConvertToInstanceMethod() {
this.convertToInstanceMethod("test");
}
void convertToInstanceMethod(String string) {
System.out.println("convertToInstanceMethod = " + this);
System.out.println("convertToInstanceMethod = " + string);
}
在修改前,调用convertToInstanceMethod方法,第一个参数相是RefactorDemo,传递是this, 修改后就那个方法直接移动到本类中。
- Copy,复制一个类
Before:
// 复制一个类
void testCopy() {
new FirstClass();
}
public class FirstClass implements Serializable {
public String first;
@Override
public String toString() {
return "FirstClass{" +
"first='" + first + '\'' +
'}';
}
}
Gif:
After:
public class SecondClass implements Serializable {
public String first;
@Override
public String toString() {
return "SecondClass{" +
"first='" + first + '\'' +
'}';
}
}
- EncapsulateFields,压缩一个字段,间接访问
Before:
String filed = "filed";
// 压缩一个字段,间接访问
void testEncapsulateFields() {
System.out.println(filed);
}
After:
private String filed = "filed";
// 压缩一个字段,间接访问
void testEncapsulateFields() {
System.out.println(getFiled());
}
public String getFiled() {
return filed;
}
public void setFiled(String filed) {
this.filed = filed;
}
相当于简介访问一个field,自动生成setter和getter。
- GenerifyRefactoring,泛型重构
Before:
// 泛型重构
void testGenerifyRefactoring() {
List list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");
}
After:
// 泛型重构
void testGenerifyRefactoring() {
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
}
自动添加泛型的参数。
- Inline,内联函数
Before:
// 内联
void testInline() {
int a = 100;