- 浏览: 145588 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
trydofor:
fujohnwang 写道为啥不是maven的问题?大概是因为 ...
jdk1.6.0_16 小bug -
fujohnwang:
为啥不是maven的问题?
jdk1.6.0_16 小bug -
trydofor:
参考资料http://supermmx.org/blog/20 ...
必须知道,别滥用-finally -
trydofor:
后续跟踪:使用javap分析finally块中return值h ...
必须知道,别滥用-finally -
trydofor:
(2)javap -c TestFor(1)javap -c ...
while(ture) 和 for(;;)
码工魄之Method修炼之道
作者:臭豆腐[trydofor.com]
日期:2009-12-03
授权:署名-非商业-保持一致 1.0 协议
声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。
文档目录
1. Method构成
2. 大师总结
3. 低级经验
3.1. MM01-保证方法的一致性
3.2. MM02-精简方法体的体积
3.3. MM03-保持简洁的返回值分支
3.5. MM05-为危险方法写好注释
4. 参考资料
1. Method构成
在程序开发中,Method译作:方法、函数。本文主要讨论Java中的方法。
从语法结构上看,一个高质量的方法应该包括以下部分。[ST]
- 注释,说明使用方法或特殊用途,如javadoc注释或@Annotation。
- 修饰符,限定作用域,可见性等,如public,static等。
- 返回值,正常结束的情况。
- 方法名,简明扼要的名字,如 getter,setter等。
- 参数列表,方法的参数。
- 异常列表,异常结束的情况。
- 方法主体,代码实现部分。
从数据流向上看,方法一般包括了一个输入流(参数列表)和一个输出流。
输出流要么是正常输出流(返回值),要么是异常输出流(异常列表)。
2. 大师总结
“Effective Java 第2版”的第七章,专门讲了方法,提到的经验有。[EJ]
- 第38条:检查参数的有效性。
- 第39条:必要时进行保护性拷贝。
- 第40条:谨慎设计方法签名。
- 第41条:慎用重载(overload)。
- 第42条:慎用可变参数。
- 第43条:返回零长度数组或者集合,而不是null。
- 第44条:为所有导出的API元素编写文档注释。
3. 低级经验
大师总结的第38,40,43条最为受用,应该是作为必备技能。
立足于国情行情,在代码堆中堆代码的时候,我们还要注意以下的低级经验。
根本目的是为了提高代码的可读性,便于理解和维护。
3.1. MM01-保证方法的一致性
一致性包括两个:说明,名称,行为三者间的一致;各返回值分支意义的一致。
为了方便理解,虚构一个五毒俱全的方法,该方法要求:
<text> 方法要求 |
/** * 返回一个拷贝列表,元素为list中从0(包括 )到 length(不包括)。 * 如果指定列表为null或length小于等于0,则返回空列表。 * 如果length大于等于指定列表长度,则拷贝包括所有元素。 * * @param list 指定列表,即数据源。 * @param length 指定长度。 * @return 一个拷贝列表,元素为list中从0(包括 )到 length(不包括)。 */ |
<java> bad copyOf | ||
|
从方法名和要求上看,该方法的返回值是一个拷贝,对该拷贝的操作,不会影响到源list。
方法有三个返回值分支(return),其中,只有第一个分支不影响源list。
像下面这样修改回好些。(少了return,多了if-else,见仁见智的吧)
<java> new copyOf | ||
|
3.2. MM02-精简方法体的体积
方法体积过大会影响理解和阅读,个人认为超过三屏的方法会影响阅读,该考虑精简了。
但不需要阅读和深入理解的代码,如自动生成的,套路相同的代码堆不需要精简。
功能强的大方法,可以提升为类,再封装成数据和方法。
功能杂的大方法,可以打散为若干小方法的组合。
大的if-else,switch-case块,可以提炼成小方法的组合。[RP,98]
<java> 组合小方法 | ||
|
3.3. MM03-保持简洁的返回值分支
提前return有利于流程控制,但过多的或过于分散的return分支不利于阅读和维护。
减少return分支的可以使用 if-else,switch-case块。(缺点,参看第 MM02条)
总之,减少返回值分支的根本目的在于提高代码的可读性和维护性。
3.4. MM04-必要时进行输出检查(返回值检查)
一个健壮的方法应该保证,如果输入正确,那么就要输出正确。
输入检查,即“第38条:检查参数的有效性。”用来保证输入正确,
可是输入正确,输出就一定能够正确么,能够和预期的一致么?
输出检查就是为了提供这样一道防线,对非预期的情况给予纠正或报错。
假设,某人写了addAbs方法,从字面上看下面方法没有问题,绝对值相加一定非负。
<java> add abs | ||
|
但是,该方法可以返回负值(相见Math.abs API),于是修改成了下面这样。
<java> add abs | ||
|
可以看到,此时的输出检查要比输入检查节省和安全。
(如果再多一个参数(int c)该如何写,如果数组呢?)
3.5. MM05-为危险方法写好注释
什么样的方法属于危险方法?
- 非线程安全或兼容的,但有可能用在多线程环境下。
- 消耗高或调用重要资源的方法,比如,连接网络或大量占用内存等。
- 修改传入参数。
- 方法逻辑高深或不易理解。
- 返回值可能会因非输入参数而改变的。
比如依赖于类变量A,而A又不具备线程安全性。
对于作者来说,危险方法一定要写好注释,以使调用者知其变数。
对于调用者来说,不知变数的方法,可以调用一次完成的,
尽量不要使用第二次,尤其某些貌似getter的方法。
<java> getter | ||
|
4. 参考资料
- ST Sun的Java指南
- EJ Effective Java 第2版(ISBN 978-7-111-25583-3,机械工业出版社)
- RP 模式与重构(ISBN 978-7-115-15336-4,人民邮电出版社)
评论
4 楼
yuantong
2009-12-05
Barcode bc = product.getBarcode();
List<Goods> lg = store.getGoods();
for (Goods goods : lg) {
goods.setBarcode(bc);
}
List<Goods> lg = store.getGoods();
for (Goods goods : lg) {
goods.setBarcode(bc);
}
3 楼
xindianshang
2009-12-05
学习了哈~谢谢分享~
2 楼
trydofor
2009-12-05
fujohnwang 写道
呵呵, 好,返璞归真了
c++之爹说,把问题搞复杂,就是为了提供程序员门槛,提高待遇。
现在门槛太低了,没必要搞那么复杂了。
1 楼
fujohnwang
2009-12-05
呵呵, 好,返璞归真了
发表评论
-
DB2-MySql-PG 事务处理的不同
2012-06-21 14:43 1582DB2-MySql-PG 事务处理的不 ... -
Scriptella ETL 快速上手
2010-07-07 11:32 3310Scriptella ETL 快速上手 作者:臭豆腐 ... -
《数据库重构》读书笔记
2010-06-07 17:23 1130http://www.trydofor.com/a9w3-au ... -
DB中自增型主键的小麻烦
2010-05-18 09:52 1217工作中自增型主键的小麻烦主要有以下几个: 1. 同DB中,多表 ... -
《深入Java虚拟机(2)》摘录
2010-04-27 16:03 823《深入Java虚拟机(2)》 ... -
《设计模式之禅》试评
2010-04-20 19:55 1398《设计模式之禅》试评 作者:臭豆腐[trydofor ... -
SQL不慎迷失在WHERE
2009-11-22 16:08 1095完整板式地址:http://www ... -
Putty,PuttyCM,WinSCP组合拳
2009-11-18 19:06 5125完整板式地址:http://www.trydofor.com/ ... -
归档聊天记录(Skype4Py)
2009-08-31 11:40 1145归档聊天记录(Skype4Py) ^^^^^^^^^^^^^^ ... -
2.1.必须/应该/可以
2009-08-04 08:58 9992.1.0.必须/应该/可以 目录 1 2.1.1.必须( ... -
码工魄[margorp]
2009-08-03 19:53 751码工魄[mǎgōngpò] margorp['mɑ:ɡɔ:p] ... -
一不小心,又获奖了.
2009-06-20 16:30 861http://tech.qq.com/a/20090619/0 ... -
又和敌人死磕到现在
2009-03-12 03:52 751每到这般时候,毫无前途和激情可言. 拉个鬼聊聊天吧. -
自由之路之全民开源
2009-03-11 13:54 1254a9text格式 自由之路之全民开源 ^^^^^^^^^^ ... -
时代不同了
2009-03-06 13:42 762昨天有朋友在www.trydofor.com留言,说要是能订阅 ... -
你会了但最好别用的东西
2009-03-04 13:12 888it技术,是你会了就能用到,能转化实际价值的东西. 法律常识, ... -
你不知道但需要知道的一个某月一日
2009-03-03 18:04 1185发现技术人员的关注点比较专注,更何况是在JE这么一个专业地方. ... -
普及法律常识,增加维权意识
2009-03-02 18:13 697也许大家早已看过了hgq0011"天灾人祸啊&quo ... -
just for fun,还是饭?
2009-03-01 20:53 883linus等大牛们也许不会想到,'just for fun' ... -
照猫画虎学太极(杨)
2009-01-15 01:29 1042照猫画虎学太极(杨) ^^^^^^^^^^^^^^^^^^ ...
相关推荐
《Java工程师修炼之道》可以看作一本Java 工程师的入职指南,也可以看作一本串联Java 后端技能点的参考手册。通过精心编排的内容,刚入门的Java 工程师能够体系化地学习相关开发技能,有经验的Java 工程师能够查漏...
Java工程师修炼之道 - 梳理Java知识体系,沓实架构基础
之前网上下的,没有标签或标签不对,于是我自己重新整理了一下目录书签。
《单元测试之道Java版:使用JUnit》PDF 下载
java 修炼之道 ,学习不能凭一时的冲动,而是每天的坚持,做好一件事,往往没有那么简单,想成为自己心中的榜样,必须拥有一技之长~
支付宝扫码付和条形码付款demo(java)
java生成一维码,包中的工程直接导入ECLIPSE中,运行web工程
目前比较通用的用Java实现条形码打印的集成插件主要有:barbecue和barcode4j. 但是用barbecue,条形码可以显示出来,可是下面对应数字却不能显示出来,当然可以自己手动加上去,不过那就不是一张图片里面的了,并且...
条形码识别Google版,jar包,源代码
java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式
windows(7/xp)(32/64)系统下,有个扫码枪,是usb接口.运行tomcat后,当扫码枪扫描到条码,就将条码的数据保存下来.准确获取到扫码枪,用纯java开发.
java游戏华容道,具体见博客http://blog.csdn.net/simon_world
Java解压RAR文件,压缩包内包含源码、Jar包、依赖包和示例程序,也可以从http://code.google.com/p/java-unrar/downloads/list这里下载支持密码的unrar项目(包括源码和jar包),其依赖包也很容易搜到。
python 调用java代码方法
java语言后台请求网站操作 java中main方法发送httpPost请求
设计模式的艺术_软件开发人员内功修炼之道,开发人员必备技能,本书我已经看了一半,觉得讲的来可以,例子也很经典.
用java代码实现zebra斑马打印机的条形码打印
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象...