空对象模式
共同作者: 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的活动ActiveRecord模块中已经包含了该模式的一些实现,该模块是对活动记录模式的实现,该活动记录模式本身就是对象关系映射系统的描述。 即,当您通过主键搜索特定对象时,将获得异常。
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的行。” 这表现出截然不同的检索方法。 我们不确定是否会取得结果。 结果集很可能为空。 因此,对于搜索一行的查找器而言,返回nil;对于搜索很多行的查找器而言,返回空数组是自然的,非异常的响应。
既然您已经阅读了有关此模式的文章,请记住不要让NULL使您的应用变得愚蠢!
在 LinkedIn 上找到合著者 。
翻译自: https://hackernoon.com/why-you-need-null-object-pattern-and-how-to-implement-it-16a96b04125f
空对象模式