设计模式,面向对象的一些思考
国庆这两天在家里看了<<面向模式的软件体系结构>>,加上之前看过<<Head First设计模式>>和<<设计模式>>这两本书,总觉得原来高端的东西似乎也没那么神秘,里面的模式自己在工作中也都用到过,并没有怎么特意地去学习,都是自己写代码总结出来的,看了三本设计模式的书,最终记住的模式也没几个,或者说,最终自己也没学到什么东西
谈设计模式一定要谈到面向对象,面向对象的本质是多态,封装和继承,设计模式则能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力
更多的来看,设计模式更像是对于面向对象编程的一种补充,是为了代码的重用性、灵活性和扩展性。但是,不管是重用,灵活,扩展,最起码的基本要求是代码的可读性
为什么C++会遭人唾弃,C语言能受到人们的追捧,一个原因就在于代码的可读性,特别是C++的模板有很多的戏法,有看过<<C++设计新思维:泛型编程与设计模式之应用>>的都知道:C++很酷,但也很复杂。大量的模板技巧写成的库节省了我们大量的时间,但同时出问题也给我们带来了大量的麻烦,因此在工作中,我一直把模板当作一种宏来使用,当然我确实忘记了很多模板的高级技巧,即使知道,我也会尽量避开,模板的作用在于可以帮助我们快速地生成代码,比如教科书的例子:
template<class T1,class T2> bool Max(T1 t1,T2 t2) { return t1 > t2; }
这样无论我们使用的是float或者int,模板都能帮我们生成代码,但是,一旦模板使用开始复杂化,带来的将会是令人晦涩的代码,有兴趣的可以去看看我上面说的这本书,或者STL和BOOST里面的很多技巧,这种戏法对于写基础库的或许需要,但是对于我们工作中,我想还是尽量少用,据说BOOST在C++ 0X之前就已经实现了lambda,惰性求值之类的,网上也有人利用C++实现了反射机制,但是我想,如果语言本身不支持,我们应该去写一些工具来自动生成代码,而不是利用一些戏法来实现,特别是模板
宁愿多写几行代码,也不要去使用一些别人难以看懂的技巧来实现
设计模式中有一些模式是使用多态的,多态是在运行时决定要调用哪个类的,虽然很多人说会降低效率,但是我觉得在现代来说这种效率并不是我们所该关心的,多态能导致的一个问题就是在写成库的时候的问题,具体看这里避免使用虚函数作为库的接口
继承,http://kbasm.iteye.com/blog/1012547,对于继承我觉得并没有什么可以批判的,我觉得合适地选择而非滥用继承,特别是多继承和虚继承最好别用,在现代的高级语言里面,如C# JAVA已经废除了多重继承,一旦C++里面觉得你需要用到多重继承,基本要重新设计类的结构了
封装实际上我觉得更多的事情是在做隔离,在大部分模式中,大部分代码都在隔离原有的代码,将A代码和B代码给隔离,中间件只是一个代理,很简单,因为我一直觉得所有的设计模式都可以归结于代理模式
无论是设计模式还是面向对象,更多的是在做类之间的管理,似乎很多人忘记了编程的本质是对于数据的操控,数据结构+算法=程序,虽然很多人都能说出这一点,但是至今很少的书能专门讲这一部分,面向模式的软件体系结构有一卷就是专门讲这个的
如果要去关心设计模式,不如去关心数据的管理,这对于程序才是最重要的,写了这么多的代码,总觉得无论是设计模式还是面向对象都是虚的,设计的本质就是管理