论坛首页 Java企业应用论坛

实践中的重构08_代码的可读性及If(null==a)和If(list.size()<1)

浏览 6055 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-18  
检验下自己,也是一个不合格的程序员,反省学习
0 请登录后投票
   发表时间:2010-12-19  
这个方法我记得在代码大全2里面有介绍过,也是一种好的方法。
我的平铺直叙也是这个意思,尽量使代码语言贴近自然语言。

0 请登录后投票
   发表时间:2010-12-19  
yuan 写道
tuti 写道
list 就不应该为null

对,除非是第3方库某个本该返回集合的方法返回了个null才需要这么处理(我认为那也是这个库的作者不专业,而且即使是第3方库也可以自己修改)。如果是自己写的方法,从语义上说,这个方法的返回值如果是一个集合,那在该方法运行结果是这个集合为空的情况下,怎么也不应该返回null。1是影响可读性,2是其它每个调用该方法的地方还要处理这个null。返回null是自己给自己找麻烦。

LZ在另一帖中 写道
get底层的服务,别人未必想的那么周全,如果它的注释中,没有声明一定不返回null的话,我觉得判一下null是比较安全的做法。


如果给自己一个“集合为空的情况下不返回null而是返回一个空集合”的原则,就不会有这个问题。

而且即使遇到别人的代码在返回空集合时用null替代,这时候是把别人的代码改简单些好呢?还是把自己的代码改复杂来适应别人的代码好?

这样的话,lz在http://www.iteye.com/topic/841196中的代码最后可以变成这样:
	private List<User> getUserList2(int size) {

		List<User> userList = new ArrayList<User>();

		userList.addAll(getUserListFromSource1(size - userList.size()));
		
		if (userList.size() >= size) return userList;

		userList.addAll(getUserListFromSource2(size - userList.size()));
		
		if (userList.size() >= size) return userList;

		userList.addAll(getUserListFromSource3(size - userList.size()));

		return userList;
	}

而且这代码还有改进的余地。但是没有上下文(对getUserList的调用;还有getUserListFromSourcex的定义),我只能写成这样。


我是完全同意集合为空的情况下不返回null而是返回一个空集合这个惯例的。
但是有以下两种情况会有纠结的地方。
1 底层代码无法改动,加入一个间接层会提高别的程序员的使用成本。
2 大型项目中,一个人所能改动的代码是有范围限制的,对于自己没有改动权限的代码问题,最多提提建议。所以这个重构也只能局限在自己的系统中。
0 请登录后投票
   发表时间:2010-12-19  
zhang_xzhi_xjtu 写道
我是完全同意集合为空的情况下不返回null而是返回一个空集合这个惯例的。
但是有以下两种情况会有纠结的地方。
1 底层代码无法改动,加入一个间接层会提高别的程序员的使用成本。
2 大型项目中,一个人所能改动的代码是有范围限制的,对于自己没有改动权限的代码问题,最多提提建议。所以这个重构也只能局限在自己的系统中。


既然知道什么是对的,那就要去做。
说说都知道,但都不去做,那和不知道又有什么区别呢。
软件开发,本来就是个协作游戏,需要相互沟通和反馈,这在大型项目中,尤其重要。

极限编程(XP)主要的价值观包括:沟通,简单,反馈,勇气,尊重。
换言之,如果缺少“沟通,反馈,勇气,尊重”,那么“简单”也是做不到的。

这个返回null不就是个例子吗?
3 请登录后投票
   发表时间:2010-12-20   最后修改:2010-12-20
:) 是呀,既然是一起做事,代码还是集体所有好些。面子问题一边去。

说来说去,agile对程序员的素质是有要求的,选人、组建团队很关键,招聘是第一关。招聘搞好了,麻烦事会少很多。扯远了……
0 请登录后投票
   发表时间:2010-12-20  
tuti 写道
zhang_xzhi_xjtu 写道
我是完全同意集合为空的情况下不返回null而是返回一个空集合这个惯例的。
但是有以下两种情况会有纠结的地方。
1 底层代码无法改动,加入一个间接层会提高别的程序员的使用成本。
2 大型项目中,一个人所能改动的代码是有范围限制的,对于自己没有改动权限的代码问题,最多提提建议。所以这个重构也只能局限在自己的系统中。


既然知道什么是对的,那就要去做。
说说都知道,但都不去做,那和不知道又有什么区别呢。
软件开发,本来就是个协作游戏,需要相互沟通和反馈,这在大型项目中,尤其重要。

极限编程(XP)主要的价值观包括:沟通,简单,反馈,勇气,尊重。
换言之,如果缺少“沟通,反馈,勇气,尊重”,那么“简单”也是做不到的。

这个返回null不就是个例子吗?

我同意你的看法。但是就我们公司来说,即使你有想法要动,公司领导也不同意。因为他们大多要的是稳定,能用就行。我们的jdk还是1.4的,浏览器IE7有的功能不能用。但是就是说以后再动。也是无奈啊
0 请登录后投票
   发表时间:2010-12-20  
一切行为都要受到实际情况的限制。

0 请登录后投票
   发表时间:2010-12-20  
zhang_xzhi_xjtu 写道
代码的可读性应该还是着重强调的。


if(null==a)

这样的代码,至少我读起来有点别扭。

当然,更厉害的是
if(list.size()<1)

我知道有些人喜欢写成
if(list.size()==0)

ok,这个我还可以想的通为什么这么写,但是<1这种写法真的让人无语。

if(list.isEmpty())

这样当然更进一步。

毕竟,代码是给人读的。

好吧,其实一般都是这么用的
if(list!=null && !list.isEmpty()){
//xixihaha
}


我们可以把对list的判null和判空抽出来,变成
if(!CollectionUtil.isEmpty(list)){
//xixihaha
}


问题在于,null和empty在特定的上下文中真的是一样的吗。




list.size()==0 没有什么可读性差的。只是个人风格地问题。


为什么不这么写呢?

if(CollectionUtil.isNotEmpty(list))






0 请登录后投票
   发表时间:2010-12-20  
mercyblitz 写道
zhang_xzhi_xjtu 写道
代码的可读性应该还是着重强调的。


if(null==a)

这样的代码,至少我读起来有点别扭。

当然,更厉害的是
if(list.size()<1)

我知道有些人喜欢写成
if(list.size()==0)

ok,这个我还可以想的通为什么这么写,但是<1这种写法真的让人无语。

if(list.isEmpty())

这样当然更进一步。

毕竟,代码是给人读的。

好吧,其实一般都是这么用的
if(list!=null && !list.isEmpty()){
//xixihaha
}


我们可以把对list的判null和判空抽出来,变成
if(!CollectionUtil.isEmpty(list)){
//xixihaha
}


问题在于,null和empty在特定的上下文中真的是一样的吗。




list.size()==0 没有什么可读性差的。只是个人风格地问题。


为什么不这么写呢?

if(CollectionUtil.isNotEmpty(list))



这样写的可读性更好。
问题在于,null和empty在特定的上下文中真的是一样的吗。

0 请登录后投票
   发表时间:2010-12-21  
zhang_xzhi_xjtu 写道
mercyblitz 写道
zhang_xzhi_xjtu 写道
代码的可读性应该还是着重强调的。


if(null==a)

这样的代码,至少我读起来有点别扭。

当然,更厉害的是
if(list.size()<1)

我知道有些人喜欢写成
if(list.size()==0)

ok,这个我还可以想的通为什么这么写,但是<1这种写法真的让人无语。

if(list.isEmpty())

这样当然更进一步。

毕竟,代码是给人读的。

好吧,其实一般都是这么用的
if(list!=null && !list.isEmpty()){
//xixihaha
}


我们可以把对list的判null和判空抽出来,变成
if(!CollectionUtil.isEmpty(list)){
//xixihaha
}


问题在于,null和empty在特定的上下文中真的是一样的吗。




list.size()==0 没有什么可读性差的。只是个人风格地问题。


为什么不这么写呢?

if(CollectionUtil.isNotEmpty(list))



这样写的可读性更好。
问题在于,null和empty在特定的上下文中真的是一样的吗。



不能完全肯定和否定,很多业务需要区分null和empty的!

一般null通过断言判断,在参数传递时,但是CollectionUtil类为了容错性,必须判断null到做empty!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics