March 26, 2017

或许是领域建模的真相

我们一提及领域建模,就好像回到了石器时代。然而这个谜题至今还未解决,就好像穴居人的生存方式,我们只能猜测、推测以及演绎,却不能真实复现。

Martin Fowler的《分析模式》总结了诸多领域分析模式,Eric Evans开创了领域驱动设计的办法,至于还要老的CRC方法,用例驱动,ICONIX方法以及稍新一些的四色建模法,都在尝试领域模型的建构,结果仍然差强人意。

这个问题或许是Mission Impossible,因为领域逻辑其实是一个复杂系统,系统中的模型如三体一般互相影响,却又隐没在混沌中,并不真实清晰地凸显出来。

在许多项目中,我多数采用混合手法进行建模。CRC、用例驱动、领域驱......

March 02, 2017

当函数成为一等公民时,设计模式的变化

GOF提出的设计模式,其本质思想是封装变化。故而,创建型模式封装的是对象创建的变化,结构型模式封装的是对象之间的协作与组合结构,行为型模式则封装了对象行为的变化。所谓“行为”,不正是函数所能要表达的吗?在支持FP的编程语言中,函数成为了一等公民,即它可以脱离对象而单独存在,也能够当做参数或返回值(高阶函数)。于是,传统的OO设计模式开始了变化,尤其是行为型模式。

函数的抽象能力

从函数的抽象角度看,任何行为都可以理解为是一个对类型进行转换的函数,这是FP思想对OO设计模式的最大冲击。例如Strategy模式与Command模式,前者封装了算法策略的变化,后者则封装了命令请求的变化。无论算法......

February 25, 2017

基于Scala Trait的设计模式

在《作为Scala语法糖的设计模式》博文中,我重点介绍了那些已经融入Scala语法的设计模式。今天要介绍的两个模式,则主要与Scala的trait有关。

Decorator Pattern

在GoF 23种设计模式中,Decorator Pattern算是一个比较特殊的模式。它充分利用了继承和组合(或者委派)各自的优势,将它们混合起来,不仅让优势扩大,还让各自的缺点得到了抵消。Decorator模式的核心思想其实是“职责分离”,即将要装饰的职责与装饰的职责分离,从而使得它们可以在各自的继承体系下独立演化,然后通过传递对象(组合)的形式完成对被装饰职责的重用。

从某种角度来讲,装饰职责与被......

February 23, 2017

作为Scala语法糖的设计模式

Scala算是一门博采众家之长的语言,兼具OO与FP的特性,若使用恰当,可以更好地将OO与FP的各自优势发挥到极致;然而问题也随之而来,倘若过分地夸大OO特性,Scala就变成了一门精简版的Java,写出的是没有Scala Style的拙劣代码;倘若过分追求FP的不变性等特性,因为Scala在类型系统以及Monad实现的繁琐性,又可能导致代码变得复杂,不易阅读,反而得不偿失。

看来,赋予程序员选择的自由,有时候未必是好事!

在OO世界里,设计模式曾经风靡全世界,你不懂设计模式,都不好意思说自己是程序员。现在呢?说你懂设计模式,倒显得你逼格低了,心里鄙视:“这年头谁还用设计模式,早过时了!”......

February 20, 2017

运用Aggregator模式实现MapReduce

MapReduce是更好地利用并行计算资源来提升数据处理能力的重要算法,如今已被主流的大数据分析平台实现,成为了大数据批量处理的主力军。利用前面介绍的Actor特性,其实我们也可以实现一个简易的MapReduce。

利用AKKA Actor来实现MapReduce,天生就支持并行计算(利用远程Actor)与异步操作。为了简便起见,本例使用了本地的Actor实现了大数据世界的Hello World,即WordCounter。

在编写字数统计器的MapReduce之前,我们需要先分辨职责,包括:

给定网页地址,获取指定网页的内容

对网页内容进行分词

为每个单词统计字数

考虑到本文的中心......