如何设计编程语言(2):类型

原文发表于 2015-12-03,我的lofter:http://kimleo.lofter.com/post/46977_922c9c7

接触过DDD(Domain Driven Design)的人都知道有很多很多很多很多的东西。

比如Value Object, 比如Entity, 比如Repository,比如Factory,比如Service。

再比如,在大多数编程语言里面都要强调自己的类型系统。比如区分基本类型和引用类型的Java,比如Structural Typing的Golang,比如比较复杂的C++,比如Duck Typing的Ruby。

那么类型究竟是个什么东西?

我们看一段代码,要知道最基本的一些东西,比如Niklaus Wirth说到过的Algorithms + Data Structures = Programs。当然,作为OO厨你可以把这个表达式中的前两项改成Object + Behavior,这并不会改变其意义。这里的Data Structure,就是我们所说的“类型”。

这里一个很重要的点就是,类型是作为一个抽象点存在,而不是“具体”的。到了DDD里,就变成了对应到领域概念的那些实体和值对象。比如,我并不需要关心如何生成一个实体的,实体只是表示领域中的一个有对应意义的个体而已。我也不需要管Repository如何进行持久化管理的,以及Service如何对我的实体对象做各种操作的。

换句话说,这些Factory、Repository和Service,放到我这边看来只是对Entity和Value Object相关联的一些操作,无非就是A -> B、() -> A、A -> ()等等。

坚持面向接口编程OO厨也许会站出来说,接口就是类型,无论什么时候能够满足接口,就可以用了。SOLID原则什么的讲一大堆,以及,Factory、Repository、Service这些也是有类型的啊等等。

当然没问题了,毕竟,Factory、Repository、Service这些东西,也只是DDD领域的一些实体而已。