n久以前写的火星文

原发表于:2004-3-26

 看了这么多书,似乎是时候总结一下前面学到的东西了吧

1. 面向对象的核心:多态
人人都知道面向对象的三要素:“封装,继承,多态”。然则,在我看来,最重要的要数“多态”了。why?封装主要是处于安全因素的考虑,而继承似乎是为了实现多态而出现的。多态,这才是标准的面向对象设计(OOD)的核心。

大师们都告诫我们,良好的设计都是“面向接口”的,这样才能保证个个模块之间是最小的耦合。一旦高层的商业逻辑依赖于底层的细节,那么,整个系统就有一种僵化性的臭味了。(同时,也违反了依赖导致原则) 一旦底层的细节发生了变化,上层无关的商业逻辑也不得不变化,传统的面向过程工程就是如此。

那么,要如何打到“面向接口”呢?这就要靠多态来完成了。Client代码只需要使用接口,而底层细节的类实现这些接口,那么,不管底层怎么变化,只要使用的多态的特性,高层的逻辑总是可以不变的。

哦,这也就是说,接口(interface)不再属于传统认识上的属于底层类,而是属于Client(高层)了

2.控制反转(回调函数)
在我开始看设计模式之前,一看到“好莱坞模式”:don’t call us, we will call you, 我总是摸不着头脑。

不过,现在我总算是多少入了点门。(这也要感谢《程序员》里熊节的系列文章)。控制反转,也就是把程序流程的控制权由客户移到了框架里去。

.net里面,C#利用Delegate来实现事件的处理,这就是回调函数。如果你想要响应某个事件的化,只要把你的事件处理函数用 Delegate封装,然后和Event链接在一起。那么,只要事件发生,利用Delegate的组播特性,就可以方面的实现对每个注册的 EventHandler的调用(这就是“we will call you”了亚)

不过,不知道Java里面是如何实现event处理的,以后要研究研究。

3.控制反转(续)
在我作毕业设计的时候,为了对Transaction进行单元测试,我使用了Interface来替换IDatabase。在UnitTest的时候,我使用了一个实现了Idatabase的MockDB来模拟Database。在代码实际运行的时候,我只需要用真实的DataAccess层里面的,同样实现了Idatabase接口的类来替换MockDB就行了。

然,在我看了最新的一起《程序员》上面Flower的文章后,才发现这就是控制反转的一种亚。傑傑傑,我不禁自鸣得意了一番:看来我和大师也想到一起去了亚。

不过,再想想,我只是无意识的使用,而大师是有理论的提出了这个观点,这就是差距..555....

4.设计模式
我并没有买《设计模式》这本书,因为感觉里面的图不是标准的UML图。-_-b 也许GOF的第2本设计模式要好些

关于设计模式,我大多是从Bob大叔的那本《敏捷开发:原则,模式,实践》里面学到的。

其实,我现在体会到,如果在项目中随意使用设计模式,完全可能陷入“过度设计”的陷阱,这也是我最怕的一件事。Kent也说过,这也是一种臭味:“不必要的复杂性”。

有前辈说过,学设计模式,有几大阶段:初期,写任何东西都是模式;后期,不再为了模式而模式。(大致如此,原话忘了......)

所以,OOD的原则:单一职能原则SRP,开放/封闭原则OCP,依赖倒置原则DIP,Liskov替换原则LSP,接口分离原则ISP,这些才是OOD的精华。真感谢Bob大叔为我们总结出了这些!

不过,就我这个初学者而言,我现在能理解的模式就那么几个,其他的?慢慢来吧

5.单元测试
Kent的大作:《TDD》,我买的e文版,看起来实在有些头痛.(这要怪我未夠班的E文,不过我读《Refactoring》的时候,感觉Flower的文笔要kent好懂亚)在TDD里,Kent把UnitTest First的原则发挥到了极至。

我能够理解TDD对于解除模块间的耦合,的确很有帮助(为了能UnitTest,你不得不写出高内聚,低耦合的类),我在毕业设计中,也采用的是TDD的方法。

不过,我似乎感觉TDD的长处在于解决底层细节,要考虑整个项目的整体框架的话,只靠TDD是肯定不行的...

PS:.net下面的Xunit成员:NUnit,的确很好用,他们的开发人员也很热情~~(再次为自己关于Exception的廢柴问题感到脸红)。希望以后能对这个开源项目作出自己的贡献

6.单元测试和重构
很简单,这两者的关系是,没了单元测试,就不可能有重构。(附加一句,重构的目的就是设计模式...胡,全部交织在一起了)

重构的确能明晰整个代码的可读性,而单元测试也保证了重构的安全,他可以防止你在重构时,无意中破坏掉什么功能。


嗯,先就写这么多吧。 很崇拜敏捷联盟的各个大师,他们的提出思路总是有一种让我醍醐灌顶的感觉。很希望在实际工作中也能继续实践到敏捷开发的方法,


不过,在我身边,真的很难找到同样对敏捷开发有兴趣的同学....很多人连UnitTest都没有听说过...

是我的兴趣脱离了实际情况么?我不知道