我总感觉一个方法返回null值有问题。当读了Misko Hevery关于
how to think about OO的博客文章后,又让我想起这个问题。
我感觉返回null值是有问题的,它大量的被使用在一个方法有不同的返回类型时。简单的用谷歌搜索一下“returning null”,你就会发现有建议把返回类型做成一个null对象。返回一个Null对象在某些情况下是合适的,但并不适合当你需要向客户端传送两种不同的东西的情形。用Misko重构的一段代码来说明这个问题。他重构的是一段登录代码(我非常喜欢他的过程),这段代码大概是这个样子:
Cookie login(Ldap ldap) {
if ( ldap.auth(user, password) )
return new Cookie(user);
return null;
}
从这段代码,可以看出两种情况(从结构上讲)
- 如果认证通过,客户端会被通知验证成功,生成一个新的Cookie
- 如果认证失败,则通过返回的null值通知客户端
客户端的方法应该是什么样的?
public void authenticateUser(User user) {
Cookie userCookie = user.login(ldap);
if (userCookie == null) {
//notify someone that auth failed
} eles {
//register them as logged in
}
}
我们在两个地方做了相同的事情,只是在语法上有稍微的不同,每个地方,我们都要检查验证是否成功。如果我们使用
IoC(反向控制)模式,或“Tell Don’t Ask”模式或“Hollywood原则”,会如何?
Cookie login(Ldap ldap, AuthenticationRegistry authenticationRegistry) {
if ( ldap.auth(user, password) )
authenticationRegistry.authSucceeded(new Cookie(user));
authenticationRegistry.authFailed(user);
}
客户端:
public void authenticateUser(User user) {
user.login(ldap,this);
}
public void authSucceeded(Cookie cookie) {
//register them as logged in
}
public void authFailed(User user) {
//register them as auth failed
}
新代码稍微有点复杂,但我感觉它很清晰,实现的更直接。现在我们的两个实体能够相互通信,我们定义了它们通信的方式。我喜欢Misko的重构,我只是更进了一步。好坏可以再讨论,但我想,如果你遇到了这种需要返回两种情况的方法时,IoC是你应该的选择。
原文:http://www.aqee.net/returning-null/
分享到:
相关推荐
主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
springboot 处理返回结果中字段为空或为null,不展示字段的问题(字段展示不全),给为空字段初始化值,如:字符串null转换为"
IS NULL: 当列的值是 NULL,此运算符返回 true。 IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。 关于 NULL 的条件比较运算是...
本文以spring boot项目为例给大家介绍SpringBoot项目中处理返回json的null值问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
解决了IoTDB第一值为null取最近一个有值的记录值返回的bug
今天用Android自带的LocationManager和Location类实现定位,然而中间却出了点问题,那就是getBestProvider在真机上测试返回null值。查阅了很多方法都没有效果,于是我自己灵机一动想出了较好的解决办法。 基本代码...
java处理返回对象中字段为null的情况,返回为字符串
=> 操作符比较值(不同于=运算符)为ture,即使两个NULL值 涉及NULL条件是特殊的。不能使用 =NULL 或 !=NULL 寻找NULL值的列。这种比较总是告诉他们是否是真正的失败,因为这是不可能的。即使是NULL=NUL
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
IS NULL: 当列的值是NULL,此运算符返回true。 IS NOT NULL: 当列的值不为NULL, 运算符返回true。 <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。 关于 NULL 的条件比较运算是比较特殊...
IS NULL: 当列的值是 NULL,此运算符返回 true。 IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 : 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。 关于 NULL 的条件...
主要介绍了Java String转换时为null的解决方法,需要的朋友可以参考下
我们有时会有这样的应用,需要在sql的left join时,需要使值为NULL的列不返回NULL而时某个特定的值,比如0。这个时候,用is_null(field,0)是行不通的,会报错的,可以用ifnull实现,但是COALESE似乎更符合标准
在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题。在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则...
在本篇文章里小编给大家整理的是一篇关于springboot中用fastjson处理返回值问题详解内容,需要的朋友们参考下。
然后就去了百度一下,说的是将struts2的返回值设为null(return null),这是因为struts2返回的是一个页面。如果在action中只进行业务逻辑不需要跳转页面的可以将String 类型改为void。这样返回的就不是整个页面了。 ...
我是用junit进行的接口测试,通过上图可以知道,测试结果返回了7条数据,但是7条数据都为null值。而我的数据库表确是有值的,这说明我的sql语句是没有问题的,于是查看了mapper文件,发现了一个问题。 从上图的...
主要介绍了mybatis执行SQL语句部分参数返回NULL问题,需要的的朋友参考下吧
如果返回NULL,说明报错,输出json_last_error(),得到的整数值对应错误提示。如下图所示: json_last_error()比较常见的是整数4, 是json字符串在json_decode之前已不完整,所以语法错误。 那么一定是客户端提交的...
说明:使用指定的替换值替换 NULL。 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将被检查是否为 NULL 的表达式。check_expression 可以为任何类型。 replacement_value:当 ...