这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
重构的定义
重构(Refactoring)这个词最初由Martin Fowler 和 Kent Beck给下的定义,它是一种修改,使软件的内部结构更容易理解,在不改变软件的可见行为方式前提下使软件更容易变更…它是一种有节制的整理代码、使bug产生几率最小化的方法。
重构的目的
- 重构可以改善软件的设计
- 重构使软件更易理解
- 重构有助于找到bug
- 重构有助于提高编程速度
重构的手段
- 去除重复的代码和死代码,使设计逻辑更加清晰。
- 利用现有信息,不断简化代码,使它们在将来变更时更加容易安全。
何时开始重构
- 项目中存在重复代码
- 类或方法过长
- 项目中模块耦合性比较高
- 缺少必要的注释,同时也有很多过多无用注释。(代码简介之道)
Android项目重构
重构分两步走:
1、建立AndroidLib类库,将与业务无关的逻辑转移到AndroidLib。我们只需要让主项目保持对类库的引用即可。既然抽取出来类库,那么我们应该至少包含哪些东西呢?
- activity:所有的activity的基类,这些是不涉及到具体的业务逻辑处理的,和主项目中的activity包下的不同,主项目中的都是涉及到具体的业务逻辑处理。
- utils:这里主要是封装我们的工具类,比如常见的DateUtils、BitmapUtils、LogUtils等。
- net:这里主要是封装的网络模块。
- cache:存放的是缓存图片和缓存数据的处理。
- ui:存放自定义控件。
2、将主项目中类进行分类划分。同上面的分类相似。
主要几个注意点:
1、为Activity进行重新定义结构。
我们常见在activity:
public class MainActivity extends Activity implements OnClickListener {
private ListView listView;
private Button btn_click;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
LinearLayout linear = (LinearLayout) findViewById(R.id.linear);
linear.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);
btn_click = (Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(this);
new LoadData().execute();
}
}
在一个onCreate方法中,我们执行了很多事情,初始化控件、设置监听、加载数据。这样写在一起就显得代码非常的拥挤,在代码重构中,我们应该控制一个方法的长度,不能太长,100行左右吧!针对上段代码,我们完全可以将这些公共的部分抽取出来。比如我们提取出一个BaseActivity。
public abstract class BaseActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initViews();
setOnClickListener();
loadData();
}
/**
* 初始化控件
*/
public abstract void initViews();
/**
* 设置监听
*/
public abstract void setOnClickListener();
/**
* 加载数据
*/
public abstract void loadData();
}
然后让我们的activity继承BaseActivity。
public class MainActivity extends BaseActivity{
private ListView listView;
private Button btn_click;
private LinearLayout linear;
@Override
public void initViews() {
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
linear = (LinearLayout) findViewById(R.id.linear);
btn_click = (Button) findViewById(R.id.btn_click);
}
@Override
public void setOnClickListener() {
btn_click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
}
@Override
public void loadData() {
new LoadData().execute();
}
}
这样是不是简介有条理很多。
2、规范统一项目中的事件模型
最常见的就是设置监听。
public void onClick(View view){
switch(view.getId()){
case R.id.action_settings:
break;
case R.id.btn_click:
break;
default:
break;
}
}
这种方式需要比对id,有点浪费时间,不如直接设置省事。
btn_click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
3、Adapter的重构
我们在开发中使用Adapter非常多,众多的Adapter有大量的方法都是重复的,我们就可以提取出来。参照Android提高篇之Adapter的抽象整合
总结
通过对代码的不断压缩,使用面向对象的特征,不断优化代码,对代码重构,以此来达到更高的扩展性和可复用。