应对变化的要诀是隔离

David John Wheeler还有一句名言:“计算机科学中的任何问题,都可以通过加上一层逻辑层来解决。”这个原则在计算机各技术领域被广泛应用。 

 

David John Wheeler有一句名言:“计算机科学中的大多数问题都可以通过增加一层间接性来解决。”间接代表着迂回。世间没有哪一条道路是完全笔直的。蜿蜒曲折的道路并非出于美的灵感,不过是因为我们需要绕开路途中的障碍罢了。

我们在设计中遇到的最大障碍,无疑就是变化。若能御变化于实现之外,软件开发就会变得美好。

应对变化的要诀是隔离。设计者需要界定对象的不变部分与可变部分,然后将可变部分隐藏起来,即使发生了变化,也不会影响到外部。这就是封装的含义。
正如地壳核心的变化如此的狂暴与迅捷,但对于地面上生活的人类而言,几乎微不可察。然而,一旦地壳的变化冲出地表,就会酿成天大的灾难。
变化对软件系统造成的灾难,并不亚于地震或者火山。
封装为对象内部的实现设定了一层隔离带,将复杂变化的业务逻辑或者算法策略隐藏在对象之内。只要保证对象的接口不发生变化,调用者与对象内部的实现就可以单独演化了。

当我们发现一个对象需要依赖另一个不稳定的对象,同时,还需要执行复杂的交互逻辑时,就可以考虑引入一个新的对象来封装这些逻辑,从而解除二者之间的耦合,隔离变化。
Spring MVC中的ModelAndView对象扮演的正是这一角色。根据MVC模式,控制器需要将模型对象所持有的数据以及数据的变化呈现到视图中。它通过寻找正确的视图对象,完成页面的展现。控制器承担了这一职责,就意味它必须依赖于视图对象。

 

David John Wheeler,1927年2月9日出生于英国伯明翰。1948年他毕业于剑桥大学三一学院数学专业,并于1951年成为全世界首位计算机博士学位获得者。

1947年,David John Wheeler就开始参加EDSAC的研制工作,并在此过程中做出了两项巨大项献。其一是发明了“Initial Orders”。我们知道,现代计算机在启动后,会首先自动执行一个所谓“自举装入程序”(Bootstrap Loader),对机器各部分作必要的检查,然后装入操作系统等基本软件,使机器处于待命、准备接收程序和指令的状态。David John Wheeler的“Initial Orders”就是现代自举装入程序的始祖,它被放在用一组电话交换机的步进开关做成的只读存储器中,只要一按启动开关,该程序就被一个自动过程拷贝到水银延迟线存储器中去,并被执行,从而从纸带上将所要运行的程序读入主存。他的这一创造使EDSAC成为当时自动化程度最高、最灵巧而名符其实的“自动电子计算机”。

另一重大项献,他提出了实现子程序转移方法“Wheeler Jump”,后来被称为“Subroutine Jump”。编过程序的人,都知道“子程序”(Subroutine)在程序设计中的重要意义和作用。子程序思想的提出与实现,一方面可以将一些常用的或有公用性的过程预先编码存在所谓子程序库中,需要时由主程序随时调用,避免了重复编码的麻烦;另一方面又可以将复杂的任务分解成较小的单位,以便于分别处理,提高了编程的效率和程序的清晰性。子程序和子程序库是首届计算机先驱奖获得者威尔克斯在研制EDSAC中首先提出的。但是威尔克斯在实现他的子程序思想时遇到了一个很大的问题,即控制如何从主程序转至子程序,又如何从子程序转回主程序。这个对于现今的程序设计人员来说十分简单的问题,当时却令所有参与研制EDSAC的人(包括威尔克斯本人)大大地伤了一回脑筋。而当时还在读研究生的David John Wheeler提出的即将发生程序转移时的地址保存起来以便后来实现返回的方法,即“Wheeler jump”,完美地解决了这个问题。他也因这一方法的发明,而获得了1985年度的计算机先驱奖。

 

解决稳定性的办法就是加一层,将不稳定性或不期望的部分,封装起来,留下稳定的、期望的接口。
譬如流动的水没有办法储存,怎么办? 加一个盛水的容器【人和水之间增加一层】来解决。

 

posted @ 2021-02-03 15:20  沧海一滴  阅读(98)  评论(0编辑  收藏  举报