从Swift函数式编程到设计模式(三)

作者: wu大维 | 来源:发表于2016-05-01 17:38 被阅读240次
    与抽象工厂模式相比,使用柯里化函数充当函数工厂,我们可以更轻松地基于一些条件创建一系列工厂方法。

    柯里化函数(Curried Function),是指接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,该函数返回一个接受余下参数的新函数。这个名词来源于逻辑学家:Haskell Curring。编程语言Haskell也取自这位逻辑学家的名字。

    抽象工厂模式(Abstract Factory)提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

    函数柯里化可以用于制造一系列相关的函数。这和抽象工厂模式的目的类似。仍然如前例,先使用Swift实现经典的抽象工厂模式。首先,我们给出一个产品族,包括两个牌子,两种设备类型的四个组合:

    然后,我们需要抽象工厂模式,来为创建这些同一主题的产品提供易于使用,方便扩展的方法:

    再看看如何使用抽象工厂:

    对于这个抽象工厂实现来说,虽然加入一个新的设备类型会有很大问题,需要改变抽象工厂的接口,但如果只增加品牌就很好办了。只需在实现一个具体品牌的工厂即可。

    然后,我们使用柯里化函数来实现一个工厂方法。这个函数接受创建产品所需要各种参数,返回具体的产品。但我们实际上不会使用这个工厂方法直接创建产品。而是使用柯里化,让这个工厂方法充当一个函数工厂,创建一批可以作为产品工厂的方法。然后,我们可以使用这批产品工厂方法创建具体的产品。

    与抽象工厂模式相比,使用柯里化函数充当函数工厂,我们可以更轻松地基于一些条件创建一系列工厂方法。

    为了方便阅读,本章3节分别写了一个playground

    源码地址:GitHub - a130785/SwiftFunctionalProgramming: Swift函数式编程

    参考文档:

    The Swift Programming Language (Swift 2.2): About Swift

    IBM developerWorks

    Java函数式编程Github源码

    设计模式出现于1990年代,那时主要的编程语言是Java和C++这样的面向对象编程语言。随着计算机语言的发展,越来越多的现代语言的出现和流行,已经改变了设计模式出现时的计算机语言背景。虽然,现在Java和C++依然流行,但Python、Scala、Groovy、Swift等现代语言使用者越来越多。函数式编程语言(Lisp、Scheme、Haskell等)也越来越来受到重视。程序员的视野大大拓展了,手中可使用的工具也更丰富了。

    所以现在有一部分人质疑设计模式已经与时代发展脱节,认为设计模式是过时的产物。设计模式解决问题的方式,增加了不必要的复杂度。在一些现代语言中,设计模式解决的问题可以更好地被其他方式处理,有些问题甚至可能根本不存在。

    这种质疑一定程度上是正确的。因为,我们现在拥有了更高级的语言工具。语言的选择是很重要的,因为语言的选择会影响我们看问题的方式。在使用过程式语言时,你可能为了方便读取数据,而“制造”某种类似于类(class)的数据结构,你可能会称这种设计模式为“封装“。但在面向对象编程语言中,你不会认为这是一个需要设计模式来解决的问题,因为语言本身已经为你解决了。在使用面向对象语言时,为了使操作可以在对象间传递,我们使用一个被称为命令模式(Command)的设计模式。但是,在拥有高阶函数的编程语言中,你可能没有意识到这是个问题。因为,你很自然地就将函数(即操作)作为参数传入到另一个函数中,而这就是函数式编程语言中高阶函数的概念。

    相关文章

      网友评论

        本文标题:从Swift函数式编程到设计模式(三)

        本文链接:https://www.haomeiwen.com/subject/xqakrttx.html