经历了错误,才懂得正确的来由。学习就是一个不断经历错误、不断改正、不断得出认知的过程。
---题记
一、四大发明之活字印刷----面向对象思想的甘露
每一位优秀程序员都知道编写一个软件,前期的软件需求分析、软件设计与建模要比编写代码的时间长很多,原因何在?
先来看一个这样古老的故事:
话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道:"喝酒唱歌,人生真爽..."。众文武齐呼:"丞相好诗!"于是一臣子速命印刷工匠刻版印刷,以便流传天下。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/93122845602.jpg" />
样张出来给曹操一看,曹操感觉不妥,说道:"喝与唱,此话过俗,应改为''对酒当歌''较好!",于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不迭。只得照办。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/7A122845695.jpg" />
样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:"人生真爽太过直接,应改问语才够意境,因此应该为''对酒当歌,人生几何?......''",当臣转告工匠之时,工匠晕倒......
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/3D122845104.jpg" />
可惜三国时期活字印刷还未发明,所以类似事情时有发生。如果有了活字印刷,则只需更改四个字即可,其他的工作也都未白做,实在妙哉。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/BF122846703.jpg" />
这个故事恰恰体现了面向对象编程中的几大特性:一.要改,只需要更改要改之字,此为可维护;二.这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用;三.此诗若要加字,只需另刻字加入即可,这是可扩展;四.字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。
其实客观的说,曹操这样的客户的要求也并不过分,不就是改几个字嘛,但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。其实,原因出在我们原先写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无奈成了非常正常的事了。
之后,我们了解了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所致,开始用分层的结构使程序更加的灵活,容易修改,并且易于复用。
二、述说我的"机房收费系统"建模之路
了解了面向对象的好处,编写软件当然要向可维护、可扩展、灵活性好等方向发展,这不我的小软件"机房收费系统"中就使用三层架构思想建模,加上了一些设计模式。
这时我们需要了解一下分层的目的:分层是为了解耦,更换掉一层不至于使系统重新做。
1.初始经典的三层架构图:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/5A122846648.jpg" />
面向对象语言几个特征:封装、继承、多态。这里的三层架构图是逻辑上的分层,把一个系统分成三层,每一层具有的职责不同,也就是将每层具有的功能封装起来。在DAL层连接不同的数据库使用多态的思想。
2.迷糊状态:我初次改造的"机房收费系统"三层架构图
4