为什么需要空对象模式以及如何实现它

合著者 Rexhep Kqiku

那里有许多编程语言和框架,准备用来解决问题。 尽管可能有数十亿个问题需要我们解决,但其中许多通常都有一些共同的主题。 当我们通常尝试解决业务问题时,我们也希望提高工作质量。 这样,我们就有了设计模式 ,这些模式是处理某些情况的一些最佳方法的抽象。

通过表的唯一标识符查找表元素是我们经常要做的事情,为此,我们可能需要考虑实现Null Object Pattern

通过提供指示该对象不存在的替代方式,此模式用于处理对象的不存在。 在大多数面向对象的语言(例如Java或C#)中,引用可能根本没有指向任何对象。 这样,我们需要检查是否有空引用,然后再遇到主要错误。

让我们举一些例子,进一步说明这种模式。 我们将通过一个非常简单的示例使用C#:

根据定义,我们始终希望收到一个Person 。 实际上,当此personId不是Persons表中任何元素的ID时,我们可能会遇到很多情况。 在这种情况下,许多开发人员的首选解决方案可能是:

这不是一个好的实现。 当我们找不到Person时 ,我们将获得一个值,但实际上是在寻找Person

结果与我们的方法名称不匹配。 如果在特殊情况下还希望返回null ,则必须将方法重命名为GetPersonByIdOrReturnNull ,这对于调用此方法的客户端来说会更有意义。

在这种情况下可能发生的另一个问题是,当我们必须获取返回的对象的属性时,例如: person.Name 。 对于.NET开发人员来说,这是一个著名的错误:如果在Java中将实现类似的语法,则对象引用未设置为对象的实例 ,或者为NullPointerException

对于上述情况,更好的解决方案可能是:

在这种情况下,我们使用了null对象模式 ,它允许您返回一个Person对象,但是有意将其属性留为空,例如:

此模式的另一个好的实现可能是:

在这种情况下,我们使用的是用户定义的异常。 我们正在抛出并捕获特定的异常,以更好地控制我们的应用程序,并尽可能避免NullReferenceException情况。

抛出我们自己的特定异常可以帮助我们产生更多的描述性错误,当我们尝试调试和解决问题时,可以节省很多时间。 我们可以轻松快速地更好地解决我们面临的问题。

Ruby on Rails的active ActiveRecord模块中已经包含了该模式的一些实现,该模块是Active Record模式的实现,而Active Record模式本身就是对象关系映射系统的描述。 即,当您通过主键搜索特定对象时,将获得异常。

Ruby on Rails的创始人David Heinemeier Hansson在《 用Rails进行敏捷Web开发 》一书中对此进行了解释:

当您使用由主键驱动的查找器时,您正在寻找特定的记录。 您希望它存在。 对Person.find(5)的调用基于我们对people表的了解。 我们希望ID为5的行。如果此调用失败-如果ID为5的记录已被破坏,则我们处于特殊情况。 这要求引发异常,因此Rails引发RecordNotFound。

另一方面,使用条件进行搜索的发现者正在寻找匹配项。 因此,Person.find(:first,:conditions =>“ name ='Dave'”)相当于告诉数据库(作为黑匣子)“给我第一个人称Dave的行。” 这表现出截然不同的检索方法。 我们不确定是否会取得结果。 结果集很可能为空。 因此,对于搜索一行的查找器,返回零,对于搜索很多行的查找器,返回一个空数组是自然的,非异常的响应。

既然您已经阅读了有关此模式的文章,请记住不要让NULL使您的应用变得愚蠢!

LinkedIn 上找到合著者

From: https://hackernoon.com/why-you-need-null-object-pattern-and-how-to-implement-it-16a96b04125f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值