`

【转】关于返回 Null 值的问题

 
阅读更多
我总感觉一个方法返回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/
分享到:
评论

相关推荐

    关于sql中求平均值出现null值的解决方案

    "关于sql中求平均值出现null值的解决方案.txt"和"注释.txt"可能包含了更详细的解释和示例代码,而"更新说明.txt"则可能记录了这些解决方案的更新和改进。如果你在实际操作中遇到困难,可以查阅这些文件获取更多信息...

    解决了IoTDB第一值为null取最近一个有值的记录值返回的bug

    4. **异常处理机制**:增强了异常处理能力,确保在遇到null值时,系统不会崩溃,而是能够优雅地处理并返回正确的结果。 5. **性能测试**:修复后的系统经过了大量的性能测试和稳定性测试,确保在不同场景下都能正确...

    解决服务器返回null的问题.zip

    "解决服务器返回null的问题.zip"这个压缩包文件提供了解决这一问题的方案,特别关注于文本和富文本中的null值处理。下面将详细介绍如何通过runtime来解决这个问题,以及涉及到的关键技术点。 首先,理解null值在...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    "解决mybatis使用char类型字段查询oracle数据库时结果返回null问题" 在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char...

    oracle中对null值的处理

    在Oracle数据库中,NULL值是一种特殊的值,表示未知或不存在的数据。它不同于任何其他值,包括空字符串('')和零。理解Oracle如何处理NULL值是数据库管理与查询中的重要一环,尤其对于数据完整性、查询逻辑以及函数...

    java处理返回对象中字段为null的情况

    java处理返回对象中字段为null的情况,返回为字符串

    springboot 处理返回结果中字段为空或为null,不展示字段的问题(字段展示不全)

    springboot 处理返回结果中字段为空或为null,不展示字段的问题(字段展示不全),给为空字段初始化值,如:字符串null转换为"

    oraclesql判断值为空-Oracle-sqlserver的空值(null)判断.pdf

    Oracle SQL 判断值为空OrNull 判断 Oracle SQL 中判断值为空或 Null 的方法有多种,在本文中,我们将介绍 Oracle 和 SQL Server 中的空值判断方法。 Oracle 中的空值判断 在 Oracle 中,可以使用 `NVL` 函数来...

    Mysql实现null值排在最前/最后的方法示例

    IS NULL: 当列的值是 NULL,此运算符返回 true。 IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。 关于 NULL 的条件比较运算是...

    null移动端崩溃问题

    这个描述中的“本类可以解决这个问题”暗示存在一个专门设计来处理null值的类或方法。 首先,我们需要理解为什么null值会导致移动应用崩溃。在大多数编程语言中,尝试访问null对象的方法或属性会抛出异常,这在Java...

    SpringBoot项目中处理返回json的null值(springboot项目为例)

    本文以spring boot项目为例给大家介绍SpringBoot项目中处理返回json的null值问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下

    检查记录集的的栏位是否是null值 CheckNull

    ### 检查记录集的字段是否是NULL值 #### 1. **问题背景** 在处理数据库时,经常会遇到某些字段为空(NULL)的情况。对于这些空值的处理至关重要,因为它们可能会影响程序的正常运行,如导致计算错误或显示不完整的...

    Java String转换时为null的解决方法

    第三种方法是使用String.valueOf方法,对象obj为null,转换结果为字符串"null",否则,返回obj.toString()的值。注意,如果obj为null,这里转换后的值已经是字符串的“null”,判空不能再用 obj == null,也不能使用...

    Mybatis查不到数据查询返回Null问题

    总的来说,当Mybatis查询返回NULL时,需要从多个角度排查问题,包括但不限于SQL语句、字符编码、参数传递、Mapper配置等。通过细心分析日志和测试,通常能找到问题所在并解决。如果你在处理这类问题时遇到困难,可以...

    【原创】通过Android自带的工具实现当前定位 + 2步搞定getBestProvider返回null的问题

    今天用Android自带的LocationManager和Location类实现定位,然而中间却出了点问题,那就是getBestProvider在真机上测试返回null值。查阅了很多方法都没有效果,于是我自己灵机一动想出了较好的解决办法。 基本代码...

    【ASP.NET编程知识】.NET Core 处理 WebAPI JSON 返回烦人的null为空.docx

    在 ASP.NET 编程中,经常遇到烦人的 null 值问题,特别是在处理 WebAPI JSON 返回数据时。数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型 Nullable,如 int?、DateTime?,null 值字段序列化返回的...

    详解MySQL中的NULL值

    因此,`NULL`与任何其他值(包括另一个`NULL`)的比较都不会返回`TRUE`,这包括`NULL = NULL`。在MySQL中,正确的处理方式是使用`IS NULL`或`IS NOT NULL`这两个专门用于检查`NULL`值的运算符。 1. `IS NULL`运算符...

    springboot中用fastjson处理返回值为null的属性值

    // 配置SerializerFeature,不显示null值的属性 fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat); // 配置日期格式 fastJsonConfig....

    数据库为空时,文本框不显示null

    在探讨“数据库为空时,文本框不显示null”的问题时,我们需要从多个角度来解析这一需求及其实现方法。...通过合理地使用条件判断或三元运算符等编程技巧,可以有效地避免null值直接显示的问题,提升用户体验。

    MySQL Left JOIN时指定NULL列返回特定值详解

    如果所有参数都是NULL,`COALESCE`则返回NULL。这个函数在标准SQL中定义,因此在多种数据库系统中都可以使用。比如,如果我们有三个可能的字段`field1`, `field2`, `field3`,并且想用0代替所有的NULL,可以这么写:...

Global site tag (gtag.js) - Google Analytics