一个开发原则:永远不要返回NULL
2015-04-27 21:38
225 查看
看一篇文章: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;
}
考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!
是这样吗?没有把握。
说实在的,我对这个原则体会不是很深,平时在使用对象前,检查是否为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;
}
考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!
是这样吗?没有把握。
相关文章推荐
- [置顶] 在字符串中查找一个特定的字符第一次出现的位置,并返回字符所在位置;如果没有则返回NULL。
- web开发安全守则之永远不要相信用户的输入
- 结对开发——返回一个整数数组中最大子数组的和
- Android开发 按back键不返回上一个Activity (Activity的启动模式)
- 结对开发-返回一个整数数组的最大子数组的和
- IOS开发之返回上一个跳转页面的方法
- 结对开发-返回一个整数数组中最大子数组的和(首尾相接版)
- IOS开发中返回值为null时的处理
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
- 驳“永远不要对一个外行聊你的专业”【十全十美】 推荐
- Android开发:getViewById返回null的原因定位
- 移动开发----Android4.4打开系统相册返回Null问题
- 对驳《永远不要对一个外行聊你的专业》
- javaweb开发过程中小工具系列之返回一个不重复的字符串
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- js写一个方法,求一个数组中的最大奇数和最小偶数,并求他们的和,如果一个数不存在则返回null。
- 永远不要对一个外行聊你的专业
- Effective Item 21: 当你必须返回一个对象时不要试图返回一个引用
- 永远不要对一个外行聊你的专业
- Android开发:findViewById返回null的解决办法