[Engineering] 设计模式奏鸣曲(四):可配置化与领域特定语言

1. 通用图灵机

代码可以看做储存在磁盘上的,一种特殊类型的数据
计算机读取到这些代码之后,就会模拟代码所描述的行为,
再针对不同的输入完成不同的动作。

这一过程的理论模型,称为通用图灵机

图灵机不同的是,

图灵机,是一台固定的计算机器,根据输入计算结果,
通用图灵机,则可用来模拟不同的图灵机,因此它有两个输入。

一个是被模拟的图灵机计算过程之编码,另一个则是被模拟图灵机的原始输入
最终,通用图灵机会得到被模拟图灵机的计算结果。

因此,代码可以被当做数据来看待。
反之亦然。

解释器模式就是这种思想的一个应用,
实际工程中,我们会对配置信息或DSL进行解析,
还原出它们所描述的计算行为。

2. 描述层次

对于大部分编程语言的代码而言,有一个比较好的性质,
那就是,我们有一定的活动空间,对代码进行重新组织
却不会改变它们(被关心)的外部行为。

这正是代码重构的可行性基础。

在代码的组织方式上,不同人会有不同的办法,
但区分出不同的描述层次,应当会是一项良好的编程实践,
提升描述层次的过程,在计算机科学中,通常被称为抽象

管理计算机系统复杂性的关键是通过一些定义明确的接口把计算机系统分成不同的抽象层次。
抽象层次允许忽略或简化系统设计的底层实现细节,从而简化高层组件的设计。
—— 《虚拟机-系统与进程的通用平台

实际操作中,接口也是用编程语言来书写的,
因此,程序员首先面对的是语言,其次是理解语言背后被描述的下一层事实。

配置也是一种语言形式,只不过它很少提供抽象机制
这样的话,我们就很难对配置信息进行指代,不利于控制复杂度。

3. 不可判定性

The Rule of Least Power指出了与编程语言相关的一项原则,

Powerful languages inhibit information reuse.

对于图灵完备的计算模型,
其结果是不可判定的,
得到结果的唯一的办法,是将它运行一遍。

一种计算模型越强大,就越难预测它的行为。

如果我们有幸发明了一种足够强大的领域特定语言
那么在判定它的运行时特征时,就会遇到麻烦,
如果没有完整的测试用例来保障,部分错误就不得不在用户使用时才显现出来。

因此,在决定设计DSL之前,不妨先考虑一下,
我们可以对它进行哪些静态检查以避免用户犯错。

4. 新语言问题

随着用户需要的语言特性被不断添加,
语言障碍会变得越来越明显,称为新语言问题
极大的增加了用户的学习成本

灵活是要有代价的。

就像一个平衡游标,一端是只有单一用途的软件,而且工作得很好,但很难或根本无法改变它的行为。
然而另一端则是编程语言,你可以用它编写游戏,应用服务器或股票管理系统,这就是灵活性。
显然,大多数软件都在两点之间,而不是这两端点中的任何一个。
—— 《持续交付

况且,用户可能并不需要灵活性,而是不想受到不该有的限制
用户也不想写配置文件,更不想用DSL进行编程,他们想要的是功能
因此我们还是将键盘从用户那里拿回来吧。

也许只有当我们自己写配置文件的时候才会发现,
它们与一些难以维护的晦涩代码,并没什么太大区别。

5. 傻瓜式框架

让系统可配的另一个动机是,让无法胜任设计工作的人员,也有能力进行开发。

然而,《领域驱动设计》一书中这样强调,

如果这些人在设计方面不够聪明,就不应该让他们来开发软件。
如果他们足够聪明,那么用『傻瓜式』的框架来应付他们只会为他们造成障碍,使他们得不到所需的工具。

消除重复劳动的软件开发宗旨,会终结在傻瓜式框架的边界上。
因为未经良好构思的框架,并没有仔细考虑如何解决用户的重复操作问题
所以,本可避免的重复劳动,就这样转移到了框架用户的日常工作之中,制造了重复劳动

这样做到底划不划算,值得深思。

结语

让系统可配置,或者采用领域特定语言,是一种很好的实践,
但是一旦构思不当,所带来的问题就会比它要解决的问题还要多。

其主要原因在于,未经深思熟虑的配置以及DSL,会限制用户的表达能力
这也是另外一个从模式的使用者角度评判设计优劣的例子。


参考

The Rule of Least Power
重构:改善既有代码的设计
设计模式
持续交付
领域驱动设计
可计算性与计算复杂度导引
形式语言与自动机理论
虚拟机-系统与进程的通用平台

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

推荐阅读更多精彩内容