学习编程只有两年的时间,还没做过什么大的应用。大一接触C语言,编了几个推箱子俄罗斯之类的小游戏。大二接触WIN API和DX,并认识了C++。那时候真的感觉C++没什么,仅仅是高级点的C罢了。可是后来才逐渐发现面向对象设计的深奥。用C++写程序真的很难,它不像C那样想实现功能就加函数,而是考虑程序的可维护性定义了各种类。而类的确定实在是太有学问了。直到上个学期末,我第一次听说了设计模式,才渐渐了解到使用面向对象设计程序也是一门博大精深的学问。我从网上down了个电子版的《设计模式》,今天就开始学习吧,有了这个BLOG也可以让大家监督我的学习。
关于该书的引言部分,最让我产生共鸣的是第1.6节。这一节道出了我接触面向对象程序设计以来遇到的种种困难与疑问。
(1).寻找合适的对象。以前写C程序程序结构大致一想就OK了,而现在却要先通盘考虑程序的功能来确定类,这对一个没有多少开发经验的人来说算得上一个挑战。每次程序写到一半的时候,我往往会发现原来的类的划分已不再适用。
(2).决定对象粒度。这个问题我有一点想法的,就是在设计类及其接口时,类的功能并不是越完善越精细越好。一个设计良好的类需要简单明了并且真正实用的接口,这也是现在一种叫做极限编程的理论所倡导的。在类设计之初为了不使类膨胀到难以控制的地步,往往只涉及比较简单适用的接口。
(3).指定对象接口。这里主要是多态。我想这是面向对象程序设计拥有如此众多设计模式的主要原因之一吧。
(4)描述对象的实现。这里主要讲了抽象类。它提出了一个原则:针对接口编程而不是对实现编程。这句话我还不太理解啊,后面慢慢理解吧。里面提到了一个混合类的名词,这是第一次听说。
(5)运用复用机制。这里做了几个比较。首先是继承与组合的比较。对二者之间的区别,原来只是笼统地认识,现在搞清楚一些了。继承可以快速方便的实现接口复用,但是它使得子类和父类之间的耦合变得太大,当父类的某个接口的实现有所变化时,子类也跟着变化了,这可能使得子类不再适应原来的需求。当然有时候这可以用继承抽象类来解决。组合保证了类与类之间良好的封装性,它的实现是动态变化的。良好的封装性使得组合方式让程序设计变得更容易控制。作者提出了第二个原则:优先使用对象组合而不是类继承。在平时的程序设计中我似乎过度使用了继承。
然后是关于委托。现在想来原来做一个socket程序的时候曾经使用过委托,当时服务器端有很多连接,但服务器端只有一个代理,代理将负责每个连接的通信。当时也有考虑到效率的问题,但最后也没想出更方便的方法。
最后是关于模板。我一直不太会用模板,学了点STL后感觉那里面的模板用的是天花乱坠。找个时间得补一下STL。
(6)关于聚合和相识。这两个词我一点都不懂。只能后面慢慢理解啦。
(7)程序应支持变化。确实,代码重写往往是因为类结构不支持新的需求了。但是做好这一点需要很多经验的。程序设计最初,我往往也是冥思苦想以使代码尽可能的支持变化,但往往做得不够好,这其中原因有对知识的理解和熟练度不够,也有对面向对象程序设计的基本方法不够熟悉。我想学习设计模式可以弥补我在这些方面的不足。
基本上就是这些,虽然其它部分也很重要,但最说到我心坎里的就是1.6这一部分。那么这次笔记就这样结束吧。