绒毛朝着正确的方向前进。“单一责任原则”最初适用于程序。例如,丹尼斯·里奇(Dennis Ritchie)会说一个函数应该做一件事并且做得很好。然后,在C ++中,Bjarne Stroustrup会说一个类应该做一件事情并且做得很好。
注意,除了经验法则,这两者在形式上彼此之间几乎没有关系。它们仅满足于用编程语言方便表达的内容。好吧,那是什么。但这与flup所要驱动的完全不同。
现代的(即,敏捷和DDD)实现更多地关注对业务重要的事物,而不是编程语言可以表达的内容。令人惊讶的是,编程语言尚未赶上。类似于FORTRAN的旧语言承担了适合当时主要概念模型的职责:每个卡片通过读卡器时所应用的过程,或者(与C中一样)伴随每个中断的处理。然后是ADT语言,已经发展成熟,可以捕捉到DDD人们后来重新发明的重要性(尽管Jim Neighbors在1968年就已经弄清了其中的大部分内容,并将其付诸实践):今天我们称之为类。(它们不是模块。)
这一步比钟摆摆动少了演变。随着摆锤转向数据,我们失去了FORTRAN固有的用例建模。当您的主要焦点涉及屏幕上的数据或形状时,这很好。对于PowerPoint之类的程序,或者至少由于其简单的操作,它是一个很好的模型。
丢失的是系统责任。我们不出售DDD的元素。而且我们不好用类方法。我们出售系统责任。在某种程度上,您需要围绕单一责任原则设计系统。
因此,如果您看过像Rebecca Wirfs-Brock或我这样的人,他们曾经谈论过类方法,那么我们现在在谈论用例。那就是我们卖的东西。这些是系统操作。用例应负单一责任。用例很少是架构单元。但是每个人都试图假装是。例如,见证SOA人员。
这就是为什么我对Trygve Reenskaug的DCI体系结构感到兴奋的原因,这在上面的精益体系结构书中已有描述。最终,它对以前对“单一责任”的武断和神秘的服从有了某种真实的地位-正如上面大多数论点所发现的那样。这种身材与人类的思维模式有关:最终用户是第一位,程序员是第二位。它涉及业务问题。而且,几乎是偶然的,它随着变化对我们的挑战而封装了变化。
我们所知的单一责任原则要么是起源以来遗留下来的恐龙,要么是我们用来替代理解的业余爱好。您需要抛弃其中的一些爱好来制作出色的软件。这需要开箱即用。仅当问题简单明了时,使事情简单明了才有效。我对这些解决方案并不十分感兴趣:它们不是典型的,也不是挑战所在。