senline

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

看一篇文章:10个经典的java开发原则,里面一个原则:永远不要返回NULL。

说实在的,我对这个原则体会不是很深,平时在使用对象前,检查是否为null已经成了习惯,也是我要求开发人员的一个标准动作。但是文中提的也有一定的道理。因此就拿过来讨论了下。
---------------------------------
为什么,因为很多代码都是 a.b(......).c(...) 这么连着调用。如果每层调用都要检查是否为空的话,代码就太难看了,也太麻烦了。有没有更好的解决方法呢?
但是不返回null,返回什么呢?显然要反悔一个类的实例,但是怎么保证得到的结果是预期的呢,也就是说,怎么能保证这样虽然不会报“未交对象引用设置到对象的实例”(实际上就是空引用)这个错误,但是能得到“正确”的结果呢。显然,应该是nul但是没有返回null是得不到正确的结果,但是我们要保证结果是可控的,也就是说,虽然代码顺利执行下来了,但是我们要知道实际上啥也不应该做。或者,我们要针对这种情况,返回可以接受的结果。
至于什么事可以接受的结果,这个有么有一定的原则和规律呢,还是需要具体问题具体分析呢?体育老师教的语文,自己都觉得没说明白,绕!
一类里要有个标志,表示出“虽然是个非空的实例,但是它确实代表null”这个意思。问题接着追下去,如果是这个意思的话,那么他的方法应该做什么呢?也就是要解答:如果不存在这个实例,那么这个方法应该是什么业务逻辑。搞清楚了这个,就可以写这样的代码了:
假设那个标志命名为  nullInstance;
if ( nullINstance ) then {
      不存在这个实例的业务逻辑;
}else{
     正常的业务逻辑。
}
 
这么说太抽象了,我们举个实际的例子吧。
设计如下简单场景:删除员工所属的部门,
(1)员工类:employee,
(2)员工所属部门(我们用方法来表示吧,不用属性了,为了说明问题):getDepartment()
(3)部门类:department;
(4)部门的删除方法:delete();
那么:
  getDepartment(){
      if( nullINstance  ){ //如果员工类是空的话
       return new Department( nullInstance=true ); //创建一个”空“实例;
     }
      else{
          return new department( thisd.deptID); //返回一个具体的部门类
     }
  }
 
 那么:类department.delete()的实现:
 delete(){
     if( nullINstance  ){ //如果空的话
          return ;
    else 
        执行删除方法:delete from department where deptid = 2222;
}
 
考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!
是这样吗?没有把握。
posted on 2015-04-27 21:38  森蓝2010  阅读(1774)  评论(0编辑  收藏  举报