大家都来谈谈平时如何用OO的观念或者正在用什么样的观念进行设计的好吗?
辉歌 2005-03-10 09:01:38 大家都来谈谈平时如何用OO的观念或者正在用什么样的观念进行设计的好吗?
这段时间想着自己从头开始构造一个Edit来,于是下了些代码,如:scintilla,BCGEdit,CrysEdit,除了scintilla之外,其他的感觉设计上和我的想法差不多。以前经常听人说起《设计模式》,难懂,没有一定的实践经验,很难懂,就想着先放着不看罢。最近搜索关于编辑器数据结构和算法相关的东西,下了《设计模式-可复用面向对象设计的基础》一书,看了其中有关于lexi的讨论,仔细看了看。这一看,加上近日的思考,感觉到了我编程思想上的一大弊病!
我从C转入到C++,一直以来,我以为我真的懂了C++,不就是继承么,不就是封装吗,不就是多态么,不就是泛型么;我还曾以了解多态的特性并实际做了些小应用而沾沾自喜。现在看来,我看了这么久的C++的书,都只是刚刚懂了C++的一点皮毛,只是刚刚懂了C++的语法而已。从就没有用OO的观点来看问题,或者只是从很少很少的点上,很矮很矮的角度看问题了。从编程到现在,一直就是以面向过程的方式思考问题:悲哀啊。
大家也许很迷茫,我说了老半天,到底在说啥呢。很简单,最近几天,我一直在考虑自动换行的问题,困扰了我很久。所以才上网找资料,所以才知道自己的思想狭隘。
实现Edit的功能的起因是因为有一天,我突然发现可以在任意窗口上,通过CreateCaret这个Win32 API来显示一个光标,甚至一个图画光标!有了光标,就有了Edit的架势和那种心情!于是开始考虑如何实现这个Edit。
我首先想到的是,如何移动光标,这需要知道输入的字符宽度,通过查询资料找到了这个函数,需要知道如何画出文字来。于是我开始思考了。一头扎进深水中,仔细思考每个细节,如何处理输入的文字,如何处理方向键,用什么方式记住当前光标位置,如何记住当前文字插入位置,如何删除文字,如何选定文字。每个问题都那么具体而微,如是开始做起来了。
但是我看到了《设计模式》中关于lexi的讨论,flyweight 模式和其他几个模式,还有scintilla的代码,突然,我感觉思想突然有了质的飞跃!以前也曾知道,要面向抽象编程,但我没有从思想上,根本认识这个问题,当真正的考虑实际的问题的时候,还是面向过程编程了,现在才真正发现,
面向对象的编程,其实就是面向抽象,首先考虑的是可能变化的东西,凡是变化的,就将其抽象出来,
算法可能变,将其抽象出来,动作可能变,将其抽象出来,对象可能变,抽象出来。有了抽象出来的东西,如何组合,看看设计模式就清楚了,或者很自然的就清楚了。可复用的程序设计,就是将可能变化的东西抽出来,上升到顶部,下面怎么变,随你的便!
设计模式,其实就是如何组织抽象的类。
但是思想变化了,我不知道如何将这个思想应用到实际上来,编程这么多年了,思维定势在那里,一考虑问题,直接奔过程去了,没有好好锻炼如何抽象可变化的东西这个能力。
大家能就如何学会抽象的分析问题,提出共性谈谈自己的看法吗?