玄妙的设计模式

在软件业谈到设计模式,绕不过的就是GoF。liujiangCE在《设计模式是编程语言本身太弱的表现?》一文中虽然引用了很多大牛观点,但如果没有倒数第二段的话,我必定是要反对的。

事实上大牛们所说的设计模式仅限于GoF,在这种争论中,我们必须还原到模式的最初含义。

GoF 之所以在软件开发中引入设计模式,源于C.Alexander的《建筑的永恒之道》。在Alexander大师的哲学中,建筑有两种:一种是生机勃勃的, 一种是死气沉沉的。二者的区别在于有生气的建筑具备了一种特质,它无处不在却又无法命名。这种无名特质无法被创造,而只能是自然地生长出来。而模式是什 么?模式是大师是从有生气的建筑中总结出来的一些共性的东西。但模式同样不能带来无名特质,因为无名特质像花一样,它不能被构建,而只能是从种子自然生长 起来。

从这个角度上去看GoF的模式就会知道,他们只是一些在C++(包括JAVA等同类型OOPL)程序开发过程中总结出来的有生气的模 式,这些模式的有效性仅限于它们所生长的环境,简单地认为在函数式语言中不需要用到这些模式就对其加以否定显然是错误的——不能说南方的榴莲到了北方种不 活就说榴莲有问题。

另一方面,模式更是与语言缺陷无关,就算是用再NB的函数式语言也有可能写出无比烂的程序。而正如原文倒数第二段所说, 函数式语言也会有自己的模式。难道这说明函数式语言也有缺陷?——当然这也是事实。那么既然所有语言都有缺陷,关模式什么事?——不能因为砖头通常都是砌 在墙里而说砖头有缺陷嘛。

对于GoF的模式,我的观点是:学习,然后全部忘记。

学习的原因在于这是有价值的经验,而忘记的原因在于防止滥用。关于滥用的问题我曾经在《不用模式的理由》一文中说过。按Alexander大师的说法就是,你不能用摄子堆砌细胞的方法造出一朵花来。同样的,堆砌模式不能带来具有无名特质的代码,而是只能造就僵死的代码。

回到模式概念的本源。

模 式并不是我们要追求的目标,我们的目标是写出有生气的代码,具备的无名特质的代码将会是它自己的主人,它将随着自然生长而越变越好。而要达到这个目标,模 式只是一个手段而已。想通这一点就好办。只要我们以这个为目标去写代码,你会发现有一些模式会自然而地出现在你的代码中。这才是模式该用到的时候。而且随 着你经验的增加,你会发现有一些新的模式自然产生,它与你用的语言,与你的所开发的应用,甚至与你的性格、信仰都有关系。与GoF或其他什么大牛没有关 系。

这时就你超越了大牛,拥有了你自己的模式语言,写出了具备无名特质的代码,踏上了属于你自己的编程永恒之道……