首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

由一段代码发表1点想法

2012-11-17 
由一段代码发表一点想法今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员

由一段代码发表一点想法
今天在公司发现了一段很怪异的代码,为此还跟公司员工争执了一下,但由于自身是新员工,我只有无奈的屈服了,心里确实不爽,在这里发表一下自己的看法。先看一下代码,代码已经我已经简化了,只有两个类,一个是action层,另一个是Service层,具体如下:
Action:

package com.yf.test;import java.util.List;public class Action {public void excute(){List list=null;list=Service.doSomething();if(list.isEmpty()){/* *此处省略其他操作 */}}}

Service
package com.yf.test;import java.util.ArrayList;import java.util.List;public class Service {public static List doSomething() {List list = new ArrayList();if(1==2){/* * 此处省略对list的其他操作 *  list=..... */}return list;}}

当我看到if(list.isEmpty()){时,发现潜在产生空指针异常的可能,然后就给同事说了一下,这里应该先判断List是否为null,然后他让我看Service层,说Service不会返回null,我看了一下,确实不会返回为null,但是关于这段代码,我觉得写的实在太烂,为什么烂,主要有一下几个原因:
1、在Service层,每次调用doSomething方法时,都实例化一个List,虚拟机都会在堆中为这个list开辟内存,这无疑实在浪费内存和虚拟机的,而且这个list只有在if条件成立时,才需要,如果if不成立,虚拟机还得在方法调用结束后,回收这块内存,这难道不是没事找事吗??
2、在Action层,action不对返回的list做非null判断,这也是一种很恶心的做法,首先,根据面向对象的封装性,Service层中的实现对Action而言,应该是不可见的,Action层应该对其返回值的可能情况做判断,即list!=null必须在Action做,如果后续Service层单独抽出,以API提供Jar包的形式,即我们无法知道里面的具体细节,这时,Action层还得做非空判断。因此,本人觉得,这段代码应该做如下重构
Action:
package com.yf.test;import java.util.List;public class Action {public void excute(){List list=null;list=Service.doSomething();if(list!=null&&list.isEmpty()){/* *此处省略其他操作 */}}}

Service
package com.yf.test;import java.util.ArrayList;import java.util.List;public class Service {public static List doSomething() {List list=null;if(1==2){list= new ArrayList();/* * 此处省略对list的其他操作 *  list=..... */}return list;}}

或许并不是每个人都认同我这种做法,不过我个人觉得这样比较合理,软件设计的时候要讲究层次,各层应该干得事情,就应该在所在层做好,而不是有其下层来保证,这种强依赖下层保证是一种很恶心的做法,如果后续下层代码逻辑变更,还得去上层看看对其的影响,这就很无耻了!!! private static final List<String> XXX = new ArrayList<String>(0); private List<String> getList(int a) { if (a == 1) { return new ArrayList<String>(); } else { return XXX; } } private void b() { List<String> b = getList(1); b.add("abc"); }
在编译时不会出错。运行时可能会出错。
private static final List<String> XXX = new ArrayList<String>(0); private List<String> getList(int a) { if (a == 1) { return new ArrayList<String>(); } else { return XXX; } } private void b() { List<String> b = getList(1); b.add("abc"); }
在编译时不会出错。运行时可能会出错。


这些要看自己怎么处理了,基本没有定式;
如查询 可以返回Collections.EMPTY_LIST
如返回的数据需要修改  建议再做一个List保存处理结果 而不是在之前的List中修改
看自己编码习惯了public class Service { public static List doSomething() { if(xxx){ List list== new ArrayList(); /* * 此处省略对list的其他操作 * */ return list; } return Collections.emptyList(); } }
仅供参考,个人愚见。 58 楼 jayming 2012-10-17   我同意楼主的观点,空指针很多时候并不是错误,我们不应该让程序在没有错误的情况下抛出空指针异常,参考hibernate返回list的方法,@return a result object returned by the action, or <code>null</code>

热点排行