Android 代码重构

啊啊  现在写的项目需要重构嘛 稍微总结一下省得以后忘了。

1.重命名:对类,接口,方法,属性等重命名,以使得更易理解

2.对结构的分解重组。

3.通过几种方式重构方法。(抽取代码:将方法内的一段代码抽取为另一个方法,以使得该段代码可以被其他方法调用,这是重构中很重要很常用的,此举可以极大的精炼代码,减少方法的代码行数。封装字段:将类的某个字段转换成属性,可以更加合理的控制字段的访问。删除参数:将方法的一个或多个参数删掉等)

首先得命名吧:

一个好的命名,一眼就可以从名字中看到它是干嘛的,做什么用,什么类型等等。比如TextView缩写为tv,ListView缩写为lv,这种缩写倒是挺简洁的,但是并不能一眼就能看出它是什么,对于不熟悉的人来说,谁知道tv和lv是什么啊,还不如用text和list更明确些。喜欢的id命名结构为:控件_范围_功能,例如:edit_login_password,这是一个登录页的密码输入框。

组件类的命名添加该组件的后缀,例如:Activity类命名添加Activity后缀,Fragment类命令添加Fragment后缀,适配器添加Adapter后缀,等等。实体类则可添加BO的后缀名称,工具类添加util后缀,接口的实现类添加Impl的后缀。接口的命名也一样,比如,我的项目中,接口层的接口后缀都带上了Api,核心层的接口后缀都带Action。

1.约定成俗的英文单词缩写.

average   ---->  avg

background  --->bg
buffer ----->buf
control ---->ctrl
delete ----->del
document  ---->doc
error ----->err
escape ---->esc
increment ---->inc
infomation ---->info
initial  ---->init
image ---->img
length --->len
library--->lib
message--->msg
password--->pwd
position--->pos
server--->srv
string --->str
temp--->tmp

2.类(classes):名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
activity 类   Aty为后缀标识,如欢迎页面类WelcomeAty.
Adapter类    Adp为后缀标识,如商品详情适配器ProductDetailAdp
公共方法类  Tools或Manager为后缀标识。如:线程池管理类:ThreadPoolManager
日志工具类:LogTools
数据库类    以DBHelper后缀标识。如城市数据库:CityDBHelper
Service类   以Service为后缀标识
BroadcastReceive  以Broadcast为后缀标识
ContentProvider   以Provider为后缀标识

3 接口(interface):命名规则与类一样采用大驼峰命名法,多以able或ible结尾,如interface Runna ble ;
 interface Accessible 。

4 方法(methods):动词或动名词,采用小驼峰命名法 例如:onCreate(),run()
initXXX()    初始化相关方法,使用init为前缀标识
isXXX()      checkXXX() 方法返回值为boolean型的请使用is或check为前缀标识
getXXX()     返回某个值的方法,使用get为前缀标识
processXXX() 对数据进行处理的方法,尽量使用process为前缀标识
displayXXX() 弹出提示框和提示信息,使用display为前缀标识
saveXXX()    与保存数据相关的,使用sav为e前缀标识
resetXXX()   对数据重组的,使用reset前缀标识
clearXXX()removeXXX()  清除数据相关的,使用clear或remove为前缀标识
drawXXX()     绘制数据或效果相关的,使用draw前缀标识

5 变量(variables)采用小驼峰命名法。类中控件名称必须与xml布局id保持一致。
1 View变量命名:控件类型描述 + 意义描述
控件               缩写
TextView           txt
Button             btn
ImageButton        imgBtn
ImageView          imgView
CheckBox           chk
RadioButton        rdoBtn
analogClock        anaClk
DigtalClock        dgtClk
DatePicker         dtPk
TimePicker         tmPk
toggleButton       tglBtn
EditText           edtTxt
ProgressBar proBar    proBar
SeekBar                            skBar
WdbView            webVi
RantingBar         ratBar
Tab                tab
Spinner            spn
Chronometer        cmt
ScollView          sclVi
TextSwitch         txtSwt
ImageSwitch        imgSwt
listView           lVi
常量(constants)全部大写,采用下划线命名法.例如:MIN_WIDTH

6. XML文件(布局文件):全部小写,采用下划线命名法
  1.Activity默认布局,以去掉后缀的Activity类进行命名。不加后缀
  2.Activity子布局,父布局名称开始,追加item 和子布局功能说明。
例如:Activity默认布局:homeposter.xml   子布局为homeposter_item_poster.xml

7.Android提供了各种资源文件,strings.xml用来存储字符串,arrays.xml用来存储字符串数组,colors.xml用来存储颜色值,dimens.xml用来存储尺寸值,等等。资源文件的单一,是说所有相关的资源信息要在资源文件里定义并引用到代码或布局文件里,而不是在代码或布局文件里直接定义。很多开发人员,为了图方便,应用界面中出现的字符串经常在代码或布局文件里直接定义的,尺寸值也是,这样造成的结果就是,当某些字符串需要修改时,比如要支持国际化,或一些尺寸值需要修改时,通常是很多地方都要修改。因此,就必须规范好,应用界面中的字符串统一在strings.xml中定义,颜色值统一在colors.xml中定义,尺寸值统一在dimens.xml中定义,代码或布局里需要用到的都去引用资源文件相应的字段。
页面标题,命名格式为:title_{页面}
按钮文字,命名格式为:btn_{按钮事件}
标签文字,命名格式为:label_{标签文字}
选项卡文字,命名格式为:tab_{选项卡文字}
消息框文字,命名格式为:toast_{消息}
编辑框的提示文字,命名格式为:hint_{提示信息}
图片的描述文字,命名格式为:desc_{图片文字}
对话框的文字,命名格式为:dialog_{文字}

资源文件单一:

strings.xml文件用来存储应用中的所有字符串,包括页面标题,按钮文字,标签文字,提示文字等等,应该做好分类并统一存放。下面是推荐的分类方法,如果某个分类的字符串数量太多了,还可以拆分出来放到一个独立的文件,比如页面标题,可以拆分到strings_title.xml文件里,其他资源文件也可以用类似的方式进行处理:

方法注释的内容

1、该方法是做什么的 。

2、传入什么样的参数给这个方法。@param
3、异常处理。@throws
4、这个方法返回什么。@return

重构方法:

重构的方法超级多,大家可以看看《重构》这本书。就说几个经常用的。

Extract Method(提炼函数)

将大段代码中的一段放进一个独立的函数中,并让函数名称解释该函数的用途。

这样写也省了注释吗,因为函数名就是他的用途嘛。

Replac Temp with Query(以查询取代临时变量)

临时变量是暂时的,而且只在所属函数中能用。如果将临时变量写成查询,就能在同一个类中使用了。

double baesPrice = a*b;

可以写成这样: double baesPrice(){ return a*b;}        可能大家觉得没必要,抛砖引玉嘛,假设原来的是一个冗余的函数。

Move Method(搬移函数)

Move Field(搬移字段)

在类之中移动状态和行为是重构过程中必不可少的措施。如果使用一个对象的次数比比在本类中使用对象的次数还多,那就应该考虑移动他的路径。

Inline Temp(内联临时变量)---在重构一书中P119

double basePrice = order.basePrice();

return (basePrice>1000)

像这样的,你有一个临时变量,只赋值了一次,那么这样改:

return (order.basePrice()>1000)

Substi Algori(替换算法)P139

就是把以前写的啰嗦的算法替换成另一个更清晰的算法。

Extrac Class(提炼类)P149

当有某个类做了应该由两个类做的事。这事就应该建立一个新类,把相关的字段和方法搬到新类。

Repla Array with Object (以对象取代数组)P186

当你有一个数组,其中各个元素代表不同的东西,最好用对象替换,每个元素以一个字段表示。

String row = new String[3];

row [0] = "Sendy";

替换成:

Performance  row  = new Performance();

row.setName("Sendy")


Repl Magic Number with Symbolic Constant(以字面常量取代魔法数)204

return mass*9.81*height;

改为:  

static final double GRAVITATION = 9.81;

return mass*GRAVITATION *height;

喏,就是把一个字面数值根据他的意义命名,将上述字面替换为这个常量。

Encapsulate Field(封装字段)206

你的类中存在一个public字段。需要将他声明称private,并提供相应的访问函数。就像get,set方法嘛。

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

面向对象的首要原则之一就是封装。你不应该把数据声明为public 否则,其他对象就会访问甚至修改这项数据。

 

Consolidate....(合并重复的条件片段)243

如果在表达式的每个分支上有着相同的一段代码,将这些重复的代码移到表达式之外。

Repla Parameter with Explicit Method(以明确的函数取代参数)

啊啊,就是你有一个方法,你在方面里面通过判断参数的值采取不同的行为。比如你需要用if语句判断这个参数是什么应该怎么操作。那就应该针对参数的每一个可能值,建立一个独立的函数。

Pull Up Field(字段上移)

Pull Up Method(函数上移)320

两个子类拥有相同的字段或者函数,应该将其移至超类。

Push Down Method(函数下移)

Push Down Field(字段下移)

超类中某个字段或者函数只被部分子类用到,将他移到那些子类中去。

 

命名参考:http://blog.sina.com.cn/s/blog_3f5dd7810101j4u2.html#cre=blogpagepc&mod=f&loc=3&r=ar&rfunc=8

方法注释的内容

1、该方法是做什么的 。

2、传入什么样的参数给这个方法。@param
3、异常处理。@throws
4、这个方法返回什么。@return

 

 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值