大家都来谈谈平时如何用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的代码,突然,我感觉思想突然有了质的飞跃!以前也曾知道,要面向抽象编程,但我没有从思想上,根本认识这个问题,当真正的考虑实际的问题的时候,还是面向过程编程了,现在才真正发现,


面向对象的编程,其实就是面向抽象,首先考虑的是可能变化的东西,凡是变化的,就将其抽象出来,

算法可能变,将其抽象出来,动作可能变,将其抽象出来,对象可能变,抽象出来。有了抽象出来的东西,如何组合,看看设计模式就清楚了,或者很自然的就清楚了。可复用的程序设计,就是将可能变化的东西抽出来,上升到顶部,下面怎么变,随你的便!

设计模式,其实就是如何组织抽象的类。

但是思想变化了,我不知道如何将这个思想应用到实际上来,编程这么多年了,思维定势在那里,一考虑问题,直接奔过程去了,没有好好锻炼如何抽象可变化的东西这个能力。

大家能就如何学会抽象的分析问题,提出共性谈谈自己的看法吗?
...全文
616 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
sum_1 2005-06-07
  • 打赏
  • 举报
回复
我说一下, 感觉OO它本身就是一组规范,这种规范规定了一组非常自然的解决问题的 方法,
自然界的事物 是相互联系的 每一个系统都能独立的存在,但又和其它的系统有互动
系统和系统之间 既有共性又有个性,一个系统 是有无数个同样规范的小系统组成的
每个小系统分工明确 对外又有显示的接口。
mostideal 2005-06-07
  • 打赏
  • 举报
回复
我也在思考之中。。。
aaww110 2005-05-06
  • 打赏
  • 举报
回复

现在csdn咋变成幼儿园了,只会数数了。唉!

lzwei3842 2005-05-06
  • 打赏
  • 举报
回复
能看到众前辈们的经验和交流,实在是鄙人一大幸事啊。。。
homtipo 2005-05-06
  • 打赏
  • 举报
回复
嗯,我也是有你的迷茫, 看着oop我都感觉不知道实际中到底能有什么用? 有用到什么程度。
Zark 2005-05-06
  • 打赏
  • 举报
回复
这一命题还真吸引人! "江山如此多娇,引无数英雄竞折腰".到头来还是那一句"黑虎掏心使在了萧峰的手里".
moonranger 2005-05-06
  • 打赏
  • 举报
回复
我开始学C++还没有多久,但是以前看过不少文章,对其思想比较了解。现在决定一直用C++开发程序,可是感觉特别别扭,书上说的让人觉得理所当然的东西在现实中感觉很难得到应用。

有的书上说,面向对象的世界里,程序是由若干个对象组成的,程序靠这些对象互相传递消息来工作。

可是怎么传递消息,怎么建立对象之间的关联,怎么让这些对象协调工作,使其成为一个完整的,健壮的,可扩展的程序?

感觉真的好迷茫!

希望听到大家的见解和经验

moonranger 2005-05-03
  • 打赏
  • 举报
回复
我和搂主有相同的感受,看了那么长时间的C++书籍,觉得自己已经很了解C++和OO了,觉得自己已经能够很深的理解封装,信息隐藏,继承和多态等概念。可是一到实际的设计和开发的时候,就发现自己不知道怎么去抽象事物和建立事物之间的关联。想来想去还是面向过程的那一套!

很想听听高手们的见解
peakpanda 2005-04-15
  • 打赏
  • 举报
回复
面向对象我的最大的体会就是自己做自己的事情,每个对象都自己完成该做的事情。程序就好像是一个有生命的机体,程序就是对象的合作和组织。有了这样的潜意识,对模式就会不知而用。要在面向对象的领域里游刃有余,没有五年八年的面向对象的经验是不行的,而且一定要有系统架构的经验,有了这些基础,再看模式,就本无招式和定式了。
Guo Li 2005-04-12
  • 打赏
  • 举报
回复
设计模式的目的就是为了适应变化。抽象就是为了分析共同点/变化点,什么时候在写程序的时候,你突然发现,一个接口就像一个int,实现这个接口的一个类就相当于数字3,像下面这样:
interface I {...}

class C : public I {...}

class A
{
private:
I a;
int b;

public:
A(interface x, int y)
{
a = x;
b = y;
}
};

int main()
{
C c;
A a(c, 3);
......

return 0;
}

你就会理解他是如何面对变化的,我可以随时把上面的3改成4,那当然我也可以随时把c换成另外一个类,只要这个类实现了接口I.
step_by_step 2005-04-11
  • 打赏
  • 举报
回复
对于设计模式的使用,个人认为在做detail design的时候很有帮助,对于high level design没有多大帮助.
其实gof的哪些模式主要的目的就是封装变化,降低以后业务需求变化的时候的工作量.
如果你能够对你目前的行业(领域)知识有很好的领会,那么我想你也能够设计出你的行业里面的设计模式.
DebugXP 2005-04-10
  • 打赏
  • 举报
回复
你没有项目开发经验。
模式应该根据实际需要应用,不需要为模式而模式。
zhangbiao1981 2005-04-09
  • 打赏
  • 举报
回复
我也想从头开始构造一个Edit,就用《设计模式》上的设计方案
zhangbiao1981 2005-04-09
  • 打赏
  • 举报
回复
面向对象的编程首先考虑的是抽象,用类表示概念,用继承关联共性,用抽象类封装表示,隐藏类的层次结构
liujinxing 2005-04-09
  • 打赏
  • 举报
回复
oo最省事了的
想的清楚
ycom__net 2005-04-09
  • 打赏
  • 举报
回复
jfjf
suyun9329 2005-04-06
  • 打赏
  • 举报
回复
SOA
loveghb 2005-04-05
  • 打赏
  • 举报
回复
还有一点,不要烂用继承,我讨厌增加功能不用脑子思考就去派生,更讨厌多重继承,简直恶心!
loveghb 2005-04-05
  • 打赏
  • 举报
回复
抽象意味着不考虑具体实现!
——————————————
说的真好!
呵呵,很同意,如果真能做到的话。

抽象意味着共性和多态

把必须实现的抽象成基类,然后派生类实现,如果实现变了,也就是换个类而已,但是调用的客户什么代码都不要动。

设计模式面太广了。总之能把偶合降低,在需求变动或者代码改动后能尽可能少的改动客户端代码的设计为最好。

实践出真知
xjp6688 2005-03-30
  • 打赏
  • 举报
回复
真正领会的确不容易呀
加载更多回复(13)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧