DDD领域驱动设计批评文集
欢迎加入“软件方法建模师”群
《软件方法》各章合集
在重审《人月神话》中译本的过程中,发现一处较严重的误译。
原文是:
the first milepost is not reached until two months have elapsed.
原译为:
两个月之后,第一个里程碑没有达到。
应改为:
两个月之后,第一个里程碑才达到。
回想责任,当年(2001-2002)审校时没有对着原文一句一句审,觉得译文无大的逻辑问题的地方就过了,有问题才标注并找原文对照。
意思都译反了,还觉得没有大的逻辑问题吗?以当时的水平,还真的是没觉察。
译得不对,首先是英语知识有缺陷(当然领域知识缺陷也会影响);看着译文没有觉得不对,那就是领域(此处即软件工程领域)知识有缺陷了——当时的知识不足以体会出作者真正想表达的意思。
不过,本文的目的不是追究责任或者辩解,这方面内容参见此文:
这回真要动刀子-征集《人月神话》中译本的翻译修正>>
本文说的是由此联想到的学习英语的问题。
如果不是已经熟练到习惯成自然,被not……until或类似的结构困扰是很常见的。
如果从状态机的角度来理解,会很有帮助,如下图:
过去分词“not reached”相当于形容词,放在系动词be后面作表语。用状态机表达就是:
【先声明:我英语一般,以下内容如果有用词不当之处,烦请指出。】
我们也可以把状态“not reached”换成一个不带not但意思差不多的“形容词”,例如“being worked on”。
因此,下面的句子应该也是可以的(吧?)。
比较两个状态名称,我们会发现,如果在过去分词和现在分词之间选择一个作为状态名称,应该优先选过去分词。像上面的例子,“not reached”优于“being worked on”,我们把输出的行为(用主动语态,原因可自行体会)补上就知道了:
可以看到,如果用现在分词“**中”作为状态名称,状态和状态的内部活动可能会重名。
但是,现在分词作为状态名称并不是最差的。最差的状态名称是“to **”(待**),因为它强烈暗示(耦合)了允许接收的事件。
你想想,你的状态名字都叫“待审核”了,不就已经暗示这个状态下能接收的事件就是“审核”了吗!
同样,虽然过去分词>现在分词>不定式,但过去分词也并非最佳选择。
最佳选择是描述性形容词,即:
描述性形容词>过去分词>现在分词>不定式
注意,这几种都可以用作状态名称,只不过如果前面的选项有合适的名称,优先选用。
我们用人举例,玉凤比较丑,她看上的人类高质量男性看不上她,她想变美。
变美有很多条路线,可能有(1)连续三年坚持锻炼注意饮食早点睡觉(2)整形(3)外星基因改造
玉凤选择了整形。
整形完毕后,玉凤拼命放电,果然有人类高质量男性和她结了婚。
我们把这个故事相关的概念画成不同的状态机图:
①最佳。没有暗示进入或离开的事件,要变美,可以整形,可以锻炼,也可以基因改造;美了,可以结婚,也可以干别的。
②不好。暗示了进入的事件,但比④要好,毕竟“整形”是已经发生过的,“已整形”至少没有暗示任何离开的事件。
③更不好。有把状态和状态下的行为混淆的可能,或者说,把状态和内部行为绑定,不过,没有暗示进入或离开的事件。
④最不好。暗示了离开的事件,“待结婚”状态下接收的事件就是“结婚”呗。
可能细心的同学会发现,②③④涉及的概念都是3个:整形、放电、结婚,其中一个刷了两遍,而号称“最佳”的①却多了一个“美”,这是不是多余?
对的,状态就是多出来的概念。
至于为什么需要“美”这样的多余概念,可以参见我的另一篇文章《DDD话语批评之一:评“状态和事件本质相同”》>>
33套UML/SysML+EA/StarUML的建模示范视频-全程字幕(20230217更新)