聊一聊重构

179 阅读3分钟

这是我参与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的抽象整合

总结

通过对代码的不断压缩,使用面向对象的特征,不断优化代码,对代码重构,以此来达到更高的扩展性和可复用。