考虑以下代码
Employee e = Db.GetEmployee("Bob"); if(e != null && e.IsTimeToPay(today)) { e.Pay(); }
大多数人曾经由于忘记对null进行检查而受挫。该管用手法虽然常见,但却是丑陋且易出错的。
通过让Db.GetEmployee抛出一个异常而不是返回null,可以减少出错的可能性。不过,try/catch块对比null的检查更加丑陋。
可以使用NULL OBJECT模式来解决这些问题。通常,该模式会消除对null进行检查的需要,并且有助于简化代码。
Employee变成了一个且有两个实现的接口。EmployeeImplementation是正常的实现。它包含Employee对象被期望拥有的所有方法和变量。当Db.GetEmployee在数据库中找到一个雇员时,就返回一个EmployeeImplementation实例。仅当Db.GetEmployee在数据库中没有找到雇员时才返回NullEmployee的实例。
结论
那些长期使用基于C语言的人已经习惯与函数对于某种失败返回null或者0。我们认为对这样的函数的返回值是需要测试的。NULL OBJECT模式改变了这一点。使用该模式,我们可以确保函数总是返回有效的对象,及时在它们失败时也是如此。这些代表失败的对象“什么也不做”。
摘录自:[美]RobertC.Martin、MicahMartin著,邓辉、孙鸣译 敏捷软件开发原则、模式与实践(C#版修订版) [M]、人民邮电出版社,2013、254-256、
时间: 2024-12-20 00:11:21