最早认识设计模式是看博客园伍迷的大话设计模式这本书(他的另一本好本是大话数据结构,最喜欢的地方是下载的源码都能正常运行)。
接口就是一个约定,它并不规定怎么做,而表示一种做什么。比如坦克要有炮,当然程序里可以有没有炮的坦克,但这样你就无法给所有坦克装弹药(毕竟是五月了,所以把王垠同志(我不知道他的水平,因为我只是一个初级程序员)关于戴帽子的比喻改了下),合作就有问题。当然接口的方法什么的必须实现,如果你增加了接口的方法,可能会遇到狂加子类的情况——这是体力活,但应该可以写个代码分析程序,然后自动加子类(这种事我没做过,没遇到过这种事,代码分析估计过几年再学);如果子类不是都要这个属性,再加个新接口或许好些。
封装是为了避免全局变量,因为变量是可变的,所以代码太长了的话,你将很难知道它的值及类型——如果要改全局变量,如果有中间操作,就新建临时变量来运算,最后改全局变量,改全局变量的类型,基本上是作死。另外,如果你的一个函数有几十多行,要方便维护,要么你就写子函数或用闭包,要么就要尽量避免改变变量的值。避免改变变量的值有时有点麻烦,往往会新建比较多的变量,但会很明显地降低程序的复杂度及提高可读性。
继承很方便,但是不灵活,所以需要用工厂模式和策略模式来弥补。php5的面向对象有了明显的进步。比如,加了private、protected、public的限制,显然能用private就要用它,在渐渐扩大的程序中,这能减少不必要的依赖。当然,对象的变量没有特别类型或别的什么限制,不要写那么多__get,__set,还是放开的好。static这个执行效率高,但要少用,因为它的继承机制和普通的不一样,一般用在最底层不怎么需要复用的类,像Yii->app::xxxx 什么的。
另外,网上有些人用php重写了伍迷写的C#代码。所以我要有所不同,偶尔会用闭包(需要5.3)加数组来模仿C的函数指针加结构体实现面向对象。
我并不打算在后面的文章写很多文字,《大话设计模式》已经写很多了。我估计我现在写不了那么有趣的东西,另外希望大家要看这本书的话,还是买正版的好。