Free Hit Counters
http://www.dellasdeals.com

海天小阁

一个生于70年代的IT人,高不成低不就,与君共勉

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  37 随笔 :: 0 文章 :: 300 评论 :: 18 Trackbacks
招砖头了,有错就改
标题应该是:
一个很能体现面向对象思想特色的超简单的程序。为亚历山大助威

看了亚历山大同志写的捅破窗户纸一文
还是有所感觉的

不过亚历山大同志明显学究气氛浓重

不好意思在这里表露真实身份了。
本人其实是一家培训机构的讲师,学业不精,经常担心自己误人子弟。

好在总会在教学中总结一些很有意思的实例

今天贡献一个给大家看看
一个必须使用面向对象才能写出来的东西,当然,过程强人可能能写出来,不过我估计一千个程序员中不一定会有一个

程序类型:WinForm
需求:
每次当鼠标双击应用程序窗体界面的时候,会在双击位置出现一个Label
该Label能自动沿着45度方向在窗体客户区内运动,且在上下左右4条边的地方会发生镜面反弹。比如45度右下运行,碰到下面后则转变成45度右上运行。大白话说就是它会来回飘啊

可选的更高要求是:
每个Label的运动角度是在出现时随机的。每个Label的运动速度也是在出现时随机确定,并且应该保持线速度稳定。

呵呵

面向对象的解,估计1小时内多数出手快的就搞定了
至于后面的更高要求,无非就是一些三角函数等等的东西,不过平时不经常用的估计早还给大学老师了

PS:我认为是不可能用面向过程完成的
因为,Label的数量不固定,且当数量达到一定数量的时候,呵呵。

通过这个题目可以深深地记住:
每个对象应该自己负责自己的事情
主控程序不应该过多干涉对象自身内部的事情


2007/9/20
PS:标题改了
自然多讲一些想法
为什么要面向对象?难道为了封装去面向对象?为了继承去面向对象?
不是的
是为了让程序员工作在更高的抽象级别,这是我对编码技术发展的认识

用C,什么都能写,C连严格的面向结构都不是呢

使用了对象的思想,让程序员来指挥一堆有生命力的对象,比直接让程序员指挥内存要让人舒服得多
并且,在构造复杂环境的情况下,面向对象比直接控制内存要少写N行代码

为什么会出现软件危机?
因为系统太大了

即使有过程强人来实现我的程序
但是在实现过程中已经有了部分属性封装的意思
即使连结构体都不用,也还可以用数组,用链表
但是大家想想看,这个时候是不是就很希望能有一个东西吧相关的内容都放到一起去呢?
其实,这就是面向对象最直接的起源
否则,我们干吗要面向对象呢?



posted on 2007-09-19 17:28 徐少侠 阅读(2987) 评论(35)  编辑 收藏 所属分类: 其他

评论

#1楼  2007-09-19 17:35 亚历山大同志      
Thanks,很好的例子。这个确实很难过程的去实现,除非是C++或者汇编牛人:}
  回复  引用  查看    

#2楼  2007-09-19 17:36 deerchao      
OO是什么?"基于对象"是什么?"面向过程"又是什么?
  回复  引用  查看    

#3楼  2007-09-19 17:37 XiaoFaye      
可选的更更更高要求是:
当拖动父窗口时,Label位置相对桌面固定,而不是相对父窗口固定。

  回复  引用  查看    

#4楼  2007-09-19 17:38 forson [未注册用户]
1*1=1,1/1=1
  回复  引用    

#5楼  2007-09-19 17:41 deerchao      
OO的经典定义是使用封装,继承,多态来解决问题.什么时候只用封装也叫OO了?那VB6不也算是OO语言了?

  回复  引用  查看    

#6楼  2007-09-19 17:41 小笨猪 [未注册用户]
这个例子很简单,说明不了问题.
windows内部的消息循环机制可以很好的解决这个问题.
我觉得,有条件还是多写写不同环境下的代码,否则确实会"误人子弟"

  回复  引用    

#7楼  2007-09-19 17:45 亚历山大同志      
@deerchao
是不是所有面向对象的程序都必须包含封装,继承,多态才能叫面向对象,没有需要多态的时候也非要去强加一个上去不然就不OO了?
  回复  引用  查看    

#8楼 [楼主] 2007-09-19 17:45 徐少侠      
@deerchao
OO 是 Object Oriented 面向对象的英文简称

基于对象 似乎是指部分在程序内含有对象概念,但是并没有完整支持面向对象里面所提到的继承、多态等特性。例如我们多数人为VB6.0还有JavaScript是基于对象的语言

面向过程 指应用程序的设计起点或者说重点是将解决任务的过程进行详细描述,并且利用层层分解的办法将一个复杂的大问题分解成若干更为基本的小问题进行分而治之。最经典的面向过程的语言例如C。不过似乎还有一说叫面向结构?没具体查资料。以后补上

  回复  引用  查看    

#9楼  2007-09-19 17:47 deerchao      
@亚历山大同志
@徐少侠
看来是我孤陋寡闻了.
今天就此打住,玩魔兽去了..
  回复  引用  查看    

#10楼  2007-09-19 18:02 Anders Cui      
为OO助威
  回复  引用  查看    

#11楼 [楼主] 2007-09-19 18:05 徐少侠      
@小笨猪
如果说Windows的消息机制
那么其实任何语言的功能都能直接用C来写?
难道就此论证不需要面向对象吗?

如果真的有MFC或者汇编高人过来
那么咱把题目搞更难一些

每个Label的重绘时间是不一致的。也就是说,每个小Label的走一步的时间是不一致的,初始化时候随机生成的。



  回复  引用  查看    

#12楼  2007-09-19 18:20 dali [未注册用户]
楼主没一点win32经验么
你不知道都是用struct描述的么
  回复  引用    

#13楼  2007-09-19 18:33 海天一鸥      
面向对象值得提倡,但仅在它适合的领域。微程序,汇编,C,应用依然广泛,仅因它们适合。

楼主提的这个问题,Win32 API很容易实现的,代码量也不多的,直接Direct X绘图好了,不过使用这种技术,没有所谓的Label的概念了,只有绘图设备句柄,屏幕缓冲区这些东西了。要知道,.NET的所有绘图API都是平台调用实现的。这个问题的解与OO并无关系。

  回复  引用  查看    

winform的不懂。讨论可以但是不要伤感情。
我可不是反对OO的,只是觉得我现在还没有能力来驾驭OO,对比来说还是面向对象更顺手一点。
  回复  引用  查看    

#15楼  2007-09-19 19:51 怪怪      
@亚历山大同志
没关系, 写一个代码生成器, 等LZ写出来, 拿算法全给还还成本来面目, LZ的"必须"二字就不存在了... ^^
  回复  引用  查看    

#16楼  2007-09-19 19:54 ooooo [未注册用户]
真的是误人子弟!
  回复  引用    

#17楼  2007-09-19 21:18 deerchao      
@怪怪
其实我估计很多人不明白你这么说是什么意思.你原贴里相关的那一段我估计他们也没看懂.
  回复  引用  查看    

#18楼  2007-09-19 22:18 STS [未注册用户]
以前的人都是用struct编程. 那是不是面向对象?
没有struct不能实现的东西. 因为连续内存块就是数据关联的基础.
就楼主你说的东西,纯粹用struct+array就能实现.
楼主你还是先去学好编程的基础东西再谈理论吧.
无论是OOP还是什么东西,最终的实现还只是连续内存块而已.

  回复  引用    

#19楼  2007-09-19 22:37 伍迷      
实话说,楼主出的题目并提供的解决方案是一个对象封装的例子。与OOP沾边,但不典型。

原因有:
第一、OOP的特性是封装、继承和多态。建议举可以包含三大特性的例子会比较典型。
第二、OOP的好处是使得代码易于维护,容易扩展,方便复用,灵活多样。建议举的实例最好从过程实现后用OO可以更好的体现四个好处为好。

正是由于此例不够典型,所以很容易引起争议。

个人意见,欢迎指正。


  回复  引用  查看    

#20楼  2007-09-19 23:39 阿福1 [未注册用户]
一个必须使用面向对象才能写出来的超简单的程序。

作者显然没理解语言和思想的区别。
OO是一种思想,这种思想让我们站在更高的高度去抽象事物,分解问题,通过降低复杂度来最终解决问题。
OO是大的框架和范围,而涉及到具体的实现,仍是过程化的。
如同C等典型的面向过程的语言也可以写出面向对象的代码,去看看《深入C++对象模型》后就明白,OO的语言之所以好用,是因为编译器在后面为我们做了很多事情,实现的细节仍是过程化的。

会用几个控件就说自己精通OO了?你上面那点图形效果和电脑游戏比起来算什么?要知道,很多超牛的电脑游戏都是C写出来的。
  回复  引用    

#21楼  2007-09-20 00:18 笨笨123 [未注册用户]
发现搞程序的人火气都是比较大。。。。
讨论就讨论嘛。。。

楼主也是的,用什么“必须”这么不安全的词汇,
以后一律用可能。
  回复  引用    

#22楼  2007-09-20 01:14 啊不才      
◎ 徐少侠 支持你,反对那些打消积极性的人



推荐你看一下吕震宇老师的一个系列,《设计模式》,或许你会有更大的收获。

同时,建议把这个系列给你的学生讲一下,他们会受益匪浅的。


  回复  引用  查看    

#23楼  2007-09-20 02:47 怪怪      
@deerchao
那是我表达的太差 :( .
  回复  引用  查看    

#24楼  2007-09-20 08:50 henry      
也不见得是,一连串的描述结构体结给运动引擎的处理.
最后由解释引擎重现UI.
不知道楼主分析了那些游戏得到自己的结论?
  回复  引用  查看    

#25楼  2007-09-20 09:40 布鲁斯南      
面向过程当然可以完成.
  回复  引用  查看    

#26楼  2007-09-20 10:20 大剑师      
我认为就没有可以OO完成而OP不能完成的
  回复  引用  查看    

#27楼  2007-09-20 10:24 Lostinet      
还记得以前用学习机的LOGO (连函数都没有,只有IF和GOTO,也没有结构和数组) , 实现了躲炮弹的游戏... 当然受语言的限制,炮弹数量有限.


  回复  引用  查看    

#28楼 [楼主] 2007-09-20 12:17 徐少侠      
招人砖头了

估计是表达不清楚,不过技术不扎实是首要因素

所有说不用OO也能做的大侠们对不住阿

我的标题不好
立刻改
该好了再来商量
  回复  引用  查看    

#29楼 [楼主] 2007-09-20 12:31 徐少侠      
标题改了
自然多讲一些想法
为什么要面向对象?难道为了封装去面向对象?为了继承去面向对象?
不是的
是为了让程序员工作在更高的抽象级别,这是我对编码技术发展的认识

用C,什么都能写,C连严格的面向结构都不是呢

使用了对象的思想,让程序员来指挥一堆有生命力的对象,比直接让程序员指挥内存要让人舒服得多
并且,在构造复杂环境的情况下,面向对象比直接控制内存要少写N行代码

为什么会出现软件危机?
因为系统太大了

即使有过程强人来实现我的程序
但是在实现过程中已经有了部分属性封装的意思
即使连结构体都不用,也还可以用数组,用链表
但是大家想想看,这个时候是不是就很希望能有一个东西吧相关的内容都放到一起去呢?
其实,这就是面向对象最直接的起源
否则,我们干吗要面向对象呢?



  回复  引用  查看    

#30楼  2007-09-20 13:29 henry      
又来骗回贴打广告,满足一下你吧说不定还能为自己打下广告
本来就没有什么必不必须使oo这玩意,接口很多时候并不OO,委托也不OO.
但使用非常广泛,没有什么的只是它们可以很好地分解和组合模块功能.目的都是为他提供工作效率和代码重用.
必不必需用面向对象根本没有一个肯定的说法,实事也证明的系统的好坏和是不是使用OO没有直接关系(按楼主的想法那很多你用的应用程序是不存在).
为什么会出现软件危机?
主要原因是软件处理的需求没有固定性,而并不是系统太大了.
讨OO意义不大因为都是理论的东西,代码写得好我想没有人会因为代码不是OO而否决它,反过来代码写得烂也没有人因为是用OO的原因说它好.
  回复  引用  查看    

#31楼 [楼主] 2007-09-20 14:45 徐少侠      
--引用--------------------------------------------------
henry: 又来骗回贴打广告,满足一下你吧说不定还能为自己打下广告
本来就没有什么必不必须使oo这玩意,接口很多时候并不OO,委托也不OO.
但使用非常广泛,没有什么的只是它们可以很好地分解和组合模块功能.目的都是为他提供工作效率和代码重用.
必不必需用面向对象根本没有一个肯定的说法,实事也证明的系统的好坏和是不是使用OO没有直接关系(按楼主的想法那很多你用的应用程序是不存在).
为什么会出现软件危机?
主要原因是软件处理的需求没有固定性,而并不是系统太大了.
讨OO意义不大因为都是理论的东西,代码写得好我想没有人会因为代码不是OO而否决它,反过来代码写得烂也没有人因为是用OO的原因说它好.
--------------------------------------------------------
冤啊
说我骗回帖
整个自尊心受打击了不说,人家C++强人一眼看出来我底子薄。苦命阿

不过吸取教训,以后不要乱来。
呵呵

  回复  引用  查看    

#32楼  2007-09-21 15:02 weiyashi [未注册用户]
易虎互联 (www.easyhoo.cn)是在现有网络文化内涵的基础上,以全新的网络理念、先进的网络技术和企业管理模式建构的。本公司以多种网络经营为载体,致力于为广大用户提供:各行业各领域、“先进的 、易懂的 、实用的、 普及的”网络商务平台,是一家拥有多元化营销网络及专业服务网络的高科技公司。 2007年易虎互联深入分析互联网行业,对大量企业网站调研,针对当前企业网站的弊端,提出“营销型”网站概念,掀起广州新一轮的企业建网风暴,开创广州企业网站建设蓝海。我们的口号:“绝不做没有销售力的网站!”


  回复  引用    

#33楼  2007-09-22 10:33 随风流月      
越俎代庖 :)
  回复  引用  查看    

#34楼  2007-09-22 13:00 oxsoft.cn [未注册用户]
到底怎么样才好?OO好还是不OO好!!!郁闷ing.....
  回复  引用    

#35楼  2007-11-26 17:46 ♂游泳的鱼      
我对LZ对C的无知表示同情
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-09-20 12:30 编辑过
成果网帮您增加网站收入


相关链接:
所属专题: 关于面向对象的讨论