设计的变与不变

古希腊哲学家巴门尼德认为:“人的思想和言语都有一个载体,如果你在这一时间和另外一个时间想到或者谈到同样一件东西,那就说明这件东西在这段时间内没有变化,如有变化的话,你说的就不是同一件东西。”

巴门尼德

这让我想起对象的实例。在面向对象设计中,默认情况下并没有约束类的实例是否为可变,这意味着我们可以通过某种方式改变实例的状态。这体现了实例的可变特征。然而,若是站在内存的角度观察实例,则又不然。无论它在内存中存储的状态如何变化,该实例的对象标识依旧是保持不变的。显然,变与不变是相对的。

切换到DDD的命题中,所谓“实体”就是那种具有唯一的可识别可跟踪ID的对象。这个ID并非程序语言在内存中为它分配的对象标识,而是从领域角度来看,由设计者为其识别,由创建者为其分配,因而具有领域语义。实体的状态当然是可变的,然而实体ID在这个实体的生命周期中却是不可变的。

与之相对的是值对象。在DDD中,强调将领域对象严格区分为实体和值对象。一个指导原则是,当你无法分辨某个领域对象究竟是实体还是值对象时,应优先将其建模为值对象。这有助于我们更好地利用值对象的不可变性。

不可变的对象能够更好地维护,因为你不用操心它的值变化,也无需追踪变化的轨迹。不变性天生支持并发。这就衍生出面向对象设计中的Immutable模式。例如Java和C#中的String类型,皆为Immutable模式的实现。

可若放在函数式编程中,这种模式就显得有些可笑了。尤其在纯函数式编程的世界里,任何东西都应该是不变的。

这种不变意味着只要它存在,就不可修改,而且恒古不变。这种追究变化背后的不变性,一直是古希腊哲学乃至科学的基本原则。物质是否永恒不变,在哲学中一直是引人深思的命题或假设;但在函数式编程中,它几乎被证明了。例如,在Haskell中,对List的任何操作,即使调用++对List进行合并,返回的都是全新的List对象,原有对象不会有任何变化。

罗素在《西方哲学简史》中写道:

有的神秘主义者认为永恒并不是指时间上的永久,它是独立于时间之外的,无前无后、无因无果,也没有逻辑可循。

我觉得函数式编程追求的不变性,可以划入这个范畴。

赫拉克利特说:“人不能两次踏进同一条河流”。这是赫拉克利特终极的哲学观,即万物随时在变。软件系统就是这样一条河流,它无时无刻不在变化,正如水不断的流动,需求也总是在变化。但若抛开原子裂变、放射衰变的科学原理,我们似乎也可以将组成整条河流的每一滴水,看做是不变的基本组成要素。这个要素就是Monad中的Identity(幺元或单位元)。这个Identity表达了单一、恒等的概念,例如Int类型中加减法运算半群(SemiGroup)中的Zero,就是一个Identity,因为半群中的任何元素a与Zero结合,依然是元素a本身。

水是如何组成一条河流的呢?这取决于组合子(Combinator)的设计与组合。只要我们找到万物的基本要素,继而设计出各种组合子,就可以演绎出世间不同的物。例如水滴虽可以组合为河流,却也可以组合为橙汁,只要我们加入橙子的另一个组合子即可。这就是面向组合子(Combinator Oriented)的设计思想。显然,它与面向对象的设计哲学背道而驰。

以哲学史观之,函数式思想更符合古典的朴素哲学观。在古希腊哲学家中,泰勒斯认为世界的元素为水,阿那克西美尼认为世界的元素是气,赫拉克利特认为世界的元素是火,而恩培多克勒则糅合了这些思想,认为世界的元素有土、气、火、水四种。而观中国古代哲学,则有五行学说认为宇宙万物都由金木水火土五种基本特性的运行和变化所构成。

不论构成万物的基本元素为何,这种哲学观不正是函数式编程的设计观吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 2016年末我遭遇瓶颈 2016年,我在一家互联网+医疗的创业公司工作。这一年在我Leader的指引下,我接触了很...
    小灰的设计实验室阅读 539评论 2 7
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,500评论 1 51
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,118评论 29 470
  • 今天的更文时间有点不正常,和同学一起吃饭去啦,吃完饭忙得跑回来更文。 同学还热情的邀请我去她家玩儿。我忙着回家,边...
    静静diary阅读 277评论 2 1
  • 我独自走在路上 望着霓虹的南京 看看眼下的生活 想想自己的未来 心中起了些许的惆怅 不知不觉 走到了星火路的尽头 ...
    爱情的逃兵阅读 188评论 0 1