说起代码整洁之道,想必大家想到更多的是那本经典重构书籍。没错,记得当时自己读那本书的时候,一边结合项目实战,一边结合书中的讲解,确实学到了很多东西,对我自己的编码风格影响极深。随着时间的流逝,书中很多具体的内容自己都记得不太清楚,但是会不自觉的应用到实际工作中,相当于成为自己的一种编码习惯了。所以在这篇博客里面,我将结合自己最近在android项目里面重构的经历,分享一些自己的代码重构体会吧,希望能够总结自己,同时帮到大家。

我记得以前遇到一个team leader他给我很深刻的影响就是人很自负,但是不得不承认技术很牛。他给我印象最深的一句话就是:你在写代码的时候,对自己的要求就是一个方法里面,最多不能够超过20-30行代码,不然我就认为你这个代码写的很烂,需要考虑重构了。从此我就深深得被他那句话给震撼到了,这句话以后一直就作为我编码时候的座右铭。好了,让我们回到正题上来吧,请看如下代码:

private void setDownGoodsListView() {
downGoodsListAdapter = new RsvAdapter(recyclerViewBelow.getContext(), downGoodsList, R.layout.goodsitem2);
recyclerViewBelow.setAdapter(downGoodsListAdapter); downGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
TrackPart currentTrack = SvmFactory.getSvm().getTrackPart();
if (currentTrack.canSell(goodsId, isHotDrank)) {
Bundle data = new Bundle();
data.putString("GoodsId", goodsId);
data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext();
Intent intent = new Intent(context, SaleActivity.class);
intent.putExtras(data);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
} @Override
public void onItemLongClick(View view, int position) { }
});
}
private void setUpGoodsListView() {
upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem);
recyclerViewTop.setAdapter(upGoodsListAdapter); upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
TrackPart currentTrack = SvmFactory.getSvm().getTrackPart();
if (currentTrack.canSell(goodsId, isHotDrank)) {
Bundle data = new Bundle();
data.putString("GoodsId", goodsId);
data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext();
Intent intent = new Intent(context, SaleActivity.class);
intent.putExtras(data);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
} @Override
public void onItemLongClick(View view, int position) { }
});
}

上面这段代码是我从最近的android项目里面截取出来两个方法,具体含义你可以理解为:有两个列表,同时绑定数据和绑定每一个item的点击事件。如果你拿到这段代码,你会怎样去重构呢?

也许聪明的你,很快就能够发现这段代码最大的问题就是冗余代码太多,有没有发现itemClick里面的代码,除了goodsId/isHot两个参数差别之外,基本全部都是一样的代码。基于上面的分析,我们可以将代码进行如下重构:

private void setUpGoodsListView() {
upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem);
recyclerViewTop.setAdapter(upGoodsListAdapter); upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
clickGoodsItemAction(view,upGoodsList.get(position).getId(),upGoodsList.get(position).isHot());
} @Override
public void onItemLongClick(View view, int position) { }
});
}
private void setDownGoodsListView() {
downGoodsListAdapter = new RsvAdapter(recyclerViewBelow.getContext(), downGoodsList, R.layout.goodsitem2);
recyclerViewBelow.setAdapter(downGoodsListAdapter); downGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
clickGoodsItemAction(view,downGoodsList.get(position).getId(),downGoodsList.get(position).isHot());
} @Override
public void onItemLongClick(View view, int position) { }
});
}
private void clickGoodsItemAction(View view,String goodsId,boolean isHotDrank){
TrackPart currentTrack = SvmFactory.getSvm().getTrackPart();
if (currentTrack.canSell(goodsId, isHotDrank)) {
Bundle data = new Bundle();
data.putString("GoodsId", goodsId);
data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext();
Intent intent = new Intent(context, SaleActivity.class);
intent.putExtras(data);
if (!(context instanceof Activity)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
}
}

可以看到,我们进行了冗余重构之后,整个代码就简洁、直观了很多。但是如果只重构到这一步的话,那么还不是很完美的代码。你也许会问,还有什么地方可重构的吗?这个时候我们可能还需要用到另外一个重构原则就是:一个方法里面尽量只做一件事情。这下你就应该能够明白接下来应该做的事情了吧?首先让我们来看看,两个set开头的方法里面到底都干了几件事情?第一件事情就是:绑定列表数据;第二件事情就是设置每一个item的点击事件;好吧,分析到这里接下来的重构就是顺理成章的事情了,set方法重构之后的代码如下:

 private void setUpGoodsListView() {
setOneAdapter();
setOneItemClick();
}
private void setDownGoodsListView() {
setTwoAdapter();
setTwoItemClick();
}
private void setOneAdapter(){
upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem);
recyclerViewTop.setAdapter(upGoodsListAdapter);
}
private void setOneItemClick(){
upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
clickGoodsItemAction(view,upGoodsList.get(position).getId(),upGoodsList.get(position).isHot());
} @Override
public void onItemLongClick(View view, int position) { }
});
}

同理连个two方法也是这样去拆分,这里就不一一贴出来了。重构到这里,你会发现整个代码结构就一目了然,但是我故意犯了个很二的错误,那就是命名规范的问题。这个也许大家都很清楚:每个变量的命名,每个方法的命名都尽量要让人家一看到这个名字就知道该方法是干什么的?所以这里可能又牵涉到一个很有意思的矛盾问题(鸡生蛋,还是蛋生鸡呢?)。也就是在我们代码里面到底是应该加注释呢?还是尽量少加注释呢?你会看到只要我们遵循命名释意的规则,我们就不需要去添加注视了,因为项目结构随时在变,很可能今天添加的注释,明天就不准了,这样的注释有比没有更害人。所以我的原则是能不加就不加。

好了,今天就到这里吧!其实还有更好的重构原则,大家可以参考一些书籍,下班了see you!

android开发系列之代码整洁之道的更多相关文章

  1. Programming好文解读系列(—)——代码整洁之道

    注:初入职场,作为一个程序员,要融入项目组的编程风格,渐渐地觉得系统地研究下如何写出整洁而高效的代码还是很有必要的.与在学校时写代码的情况不同,实现某个功能是不难的,需要下功夫的地方在于如何做一些防御 ...

  2. <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合

    一.前言                                                                                       几个月前的看书笔记 ...

  3. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  4. <读书笔记> 代码整洁之道

    概述      1.本文档的内容主要来源于书籍<代码整洁之道>作者Robert C.Martin,属于读书笔记. 2.软件质量,不仅依赖于架构和项目管理,而且与代码质量紧密相关,本书提出一 ...

  5. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

  6. Python代码整洁之道(一)

    很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯.对此呢,我特意收集了一些适合所有学习 Python 的人, ...

  7. 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周

    <代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...

  8. 《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)

    <代码整洁之道>ch1~ch4读书笔记  <clean code>正如其书名所言,是一本关于整洁代码规范的“教科书”.作者在书中通过实例阐述了整洁代码带来的种种利处以及混乱代码 ...

  9. 《代码整洁之道 中文版》高清 PDF 电子书下载

    代码整洁之道.PDF 下载 代码整洁之道.PDF 中文版 高清 PDF  电子书下载 代码整洁之道下载  点我下载 作者简介  · · · · · · Robert C. Martin,Object ...

随机推荐

  1. 让Windows7运行速度更快的BIOS优化设置教程

    和以前使用WindowsXP一样,很多用户都在设法提高windows7的系统运行速速,比较常见的方法大多是对系统服务进行优化,去掉一些可有可无的系统服务,还有就是优化资源管理器菜单等.除此之外,还有一 ...

  2. 学习练习 java 实例属性 静态属性

    package com.hanqi; public class Test11Car11 { //静态 //实例属性 private int m = 0; //静态属性 //所有实例共有的,在内存里只有 ...

  3. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  4. .NET本质论之三(应用程序对象 )

    2.1 请求的处理参数------上下文对象HttpContext   现在,请求已经到达了ASP.NET服务器,为了处理请求,ASP.NET在服务器上创建了HttpRequest类型的对象以表示请求 ...

  5. [drp 6]接口和抽象类的区别,及其应用场景

    导读:在很多时候,接口和抽象类可以替换.发现这个问题,还是之前学习设计模式的时候,看到那个UML图发现的.那么,究竟在什么时候使用接口,什么时候使用抽象类呢?现在结合这个项目,做一个总结. 一.接口 ...

  6. Oracle笔记 目录索引

    Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Or ...

  7. [my]_ubuntu12.10_/etc/apt/sources.list

    deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse deb-src http://mirror ...

  8. Easyui扩展或者重载(方法和属性)

    1: 使用$.fn.datagrid.defaults.editors重载默认值. 每个编辑器都有以下方法: 名称 属性 描述 init container, options 初始化编辑器并返回目标对 ...

  9. 一款简单射击游戏IOS源码

    源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...

  10. MySQL安装图文教程

    下载 1.下载地址: http://www.mysql.com/downloads/ 2.下载图解 下载社区版本就可以,社区版里有我们的想要的几乎全部功能.只不过 商业版的mysql会提供一定高级的解 ...