换个角度理解之银弹
2017-12-31 本文已影响23人
夫礼者
《换个角度理解之设计模式》的草稿已经放了一个多月了,始终感觉缺少点什么。最近因为工作需要在读Shiro,Thymeleaf源码,而在阅读过程中时不时地会回想起还在做.NET的时候看过的 《程序员的自我修养—链接、装载与库》一书的这样一句话——“软件开发领域的银弹——引入中间层”。
说句题外话,这本书当初依然是听取了很多人的推荐。但买回来之后才发现是讲C艹的。得益于当时的工资低但工作轻松,所以还是抽空看了一些。
1. 来源
下面这张图是我刚刚专门从网上截取来的。
《程序员的自我修养—链接、装载与库》P82. 解读
我还是从两个核心概念出发尝试阐述下对这句话的理解。
2.1 推迟作决定的时机
对上面这句话的理解最直接的当然就是推迟作决定的时机。中间层的引入最明显的就是再次将必须做出决定的时机后延。时机的后延也就意味着我们为应对变动留出了更多的空间,系统也因此变得更加牢固。
但是请记住,这种方式并不是完美无瑕的。引入中间层的一大弊端就是增加了理解上的难度,这也是考验架构师的一个重要指标——哪些才是必要的中间层?
本人曾经总结过这样一句话: “真正做出决定的时间点和假装做出决定的时间点之间的间隔越大,系统将越灵活,越牢固。大部分系统不稳定性的重要原因之一正是作决定的时机太早,导致之后作决定时被之前作下的决定所束缚,进而处处受制”。
2.2 知道自己不该知道什么
中间层引入之后,对于中间层之上的调用者而言,它就不应该去关心中间层之下的相关细节,它只需要遵守中间层的契约,来获取自己想要的结果。
看了上面这段语言,是否感觉这个中间层的解释很像接口。没错,接口就是中间层的一种形式。
所以在你引入了中间层之后,
- 当你处在中间层之上时,一定要谨记自己该知道的,以及不该知道的。尤其是后者,你作出的假设越少,系统的灵活性越大。
- 而当你位于中间层之下时,而是谨记不要去关注中间层之外的其他问题。这也符合很多前辈所教育我们的“不要对软件的其它部分做出任何假设”。
3. 总结
虽然是做.NET的时候就看到了这个言论,但真正有所感悟的则是在转入Java,看了这么多的源码之后。
回头想想曾经看过的那些优秀源码,对于它们设计中的精密之处,彼此之间似乎越来越像了!