转载

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、寻求《近匠》报道,或给文章挑错,欢迎发送邮件至tangxy#csdn.net(请把#改成@)。 

一旦函数的返回值是nil,就很容易过度扩散。nil和optional拆包检测会影响所有的函数,而整个面向对象方法(object-oriented approach)也会遭殃。我们没有创建特定的具体对象,而是直接写下程序代码:

if this is not nil, do that, else that.

Swift的optionals将null 参数形式化了,因而显示出比Objective-C更大的优越性,甚至不止于此。

常见的解决方案之一是抛出一个error。函数要么返回非optional值,要么抛出。这是一个完全正常的解决方案,但它有时是没有对象的。

Null Object pattern(空对象模式)中,Null Object移除了optionals,使代码更加简洁和精炼。以来电事件为例,如果一个phone call注册返回一个可选phone call,就必须在挂断之前对其进行拆包。

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

但是如果返回的phone call是非optional,代码就会更短。

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

虽然optional拆包没什么大不了,但是它会扩散到整个代码库。发生多次optional拆包,即Pyramid of Doom(无尽模式)也很有可能。

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

Swift Guard Statement能起点儿作用,但并不能精简函数或大大提高其可读性。

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

示例——与null对象作对比:

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

基于得墨忒耳定律,我们不应该在从account对象那里接收的phone call上调用任何方法。Account对象应该有一个类似于HangUpFirstCall()的方法。但是现在这仅仅关乎optionals和nil。

应用实例

下来列举两个Swift语言中Null Object Pattern的应用实例。两种途径——protocol(协议)和inheritance(继承)——均为手动检测对象是否是null。

尽管Null Objective Pattern的目的就是避免在null对象之内检测和隐藏特殊的case,有时还是需要从null对象之外检测。检测的次数应该会少很多。

协议

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

继承

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

注意:NullPhoneCall类是私有的,应像PhoneCall类一样放在同一个文件中定义,而不可能在对象之外创建一个实例。

只有访问PhoneCall.nullPhoneCall类型属性才能够进行检测。

总结

Swift用来创建APIs的对象完全可以是null,但当接收的对象来自一个可以为null的函数时,就需要额外的检测和拆包。

这些检测增加了函数的长度,会扩散,而且通常是复制的代码。Null Object Pattern除了创建返回非optional类型的抛出函数之外,也可以用来精简代码,增强可读性。

(翻译/张新慧 审校/唐小引)

文章来源:Null Object Pattern in Swift

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。

被遗忘的设计模式——详解Swift语言中的Null Object Pattern

正文到此结束
Loading...