因为最近用面向对象做迷宫,思考了许多问题。然后今天又看了系统分析的一些书,有了若干领悟,在此拿出来与诸位博友分享。
关于封装的领悟:
key 1。封装的目标:封装易变动的部分。(前人的经验总结)
key 2。尽可能精确地定位变动。(威老的升华)
封装的好处就是可以减少变动对整个系统带来的影响,并且可以有效地控制系统的复杂程度。
PC机的封装就是一个很经典的例子,我们只需要知道电脑由CPU、内存、主板、硬盘……组成,而不是去探究PC是由什么或非门、全加器、乘法器……之类的东西组成。
当我们的内存需要加大时,不需要拔掉原有的内存,只需要加上另一条内存即可,扩展的同时又不影响原有的内存。内存坏了,只需要拔掉它,换上另一个好的即可。如果没有封装,我们就把内存从1Gb升级到2Gb就必须把整个PC机拿去工厂里焊上1Gb的内存颗粒。若不封装,也就没有所谓的CPU、内存之类的概念,PC坏了,就得一个一个电路地排查过去,数亿个晶体管以及数不清的线路要查到哪一年去?
在威老的迷宫第二季里,我提取并封装了RouteChecker,因为这是一个很有可能发生变动的地方(可能会增加其他方向的Check,NortheastChecker、SoutheastChecker等等),在我封装了之后,这个地方的变动对Explorer类的影响就大大减小了。但是,在文章的最后我又发现了2个很严重的问题:
1。我需要对Walk进行同样的封装,工作量十分巨大。
2。就算我封装好了Walk,当我需要增加其他的方向的Check时,也会需要增加NortheastWalk、SoutheastWalk…显然这里存在着很严重的问题。重复了。
那么问题究竟出在哪里?
经过排查,我发现问题就出在RouteChecker并不是变动的具体地点,变动发生在RouteChecker的方向上,其实只有方向发生了变动!所以我们要做的是封装方向!
好比我封装时候把专管计算的CPU给忽略了,而另外给硬盘配备了一个计算模块,那么接下来,我也必须给内存、主板、光驱……这一大堆的东西也各配备一个完全一样的计算模块,这样的设计显然烂到无可救药。
Very Good 找到了问题所在,接下来要办的事情就简单了,修改模型!
很快我便到以下模型:
系统几乎简化了一倍!复杂程度大大降低!实实在在地尝到了面向对象的甜头。
到这里我真是越来越佩服我自己了。。。
精确定位变动
大家想必也已经产生共鸣了吧!
作者:威老 From cnblogs