探讨几个入门级的面向对象小问题

nonocast 2005-03-28 10:06:31
学习OO不久,想请教大家几个问题

1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义

2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?

3.面向对象与面向过程是对立的还是相辅相成的?

看到大家都在这里讨论UML/ROSE/Pattern,小弟不才,问两个关于对象的问题
还望大家指教
...全文
1204 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
awuzi 2005-07-13
  • 打赏
  • 举报
回复
本来不太懂,看过之后还是不太懂
看样子要多看书,多实践了
谢谢各位在讨论中提到了那么多经典书籍,一定拿来看
nonocast 2005-07-13
  • 打赏
  • 举报
回复
可能OO的核心就是抽象
提取稳定的接口
从人观察的角度出发
yhb7805 2005-07-12
  • 打赏
  • 举报
回复
我个人觉得OO是考虑问题的角度和OP不一样,OO是从应用的角度出发,而OP是从程序的角度出发,《THINK IN C++/JAVA》里对这个讲解的更明白,可惜我还没有深刻体会。
如果是OOD的话,个人认为更应该注重抽象和封装;而在OOP的阶段,才更注重具体实现语言的特点,所以我认为至少在OOD阶段,是不用考虑语言本身的(至少语言本身不是重点)。
g961681 2005-07-06
  • 打赏
  • 举报
回复
```````````
fanweiwei 2005-07-05
  • 打赏
  • 举报
回复
mark
lovebanyi 2005-07-05
  • 打赏
  • 举报
回复
就谈一点.我所知道纯面象对象的语言C#中是没有全局变量和函数.微软推荐用静态变量和函数代替它
seandsky 2005-07-05
  • 打赏
  • 举报
回复
1。 其实,OO是一种分析问题的方法,语言是解决问题的工具。
当你已经分析了某个问题之后,就需要选择一个合适的工具。这就好比是耕地,确定好了播种的土地,你就需要确定使用自动化的耕作还是手工犁作。

只存在工具是否合适的问题。都可以耕地,只是哪个更适合。同样,都可以用来搞面向对象,只是看你怎么看待问题。或许是否有类就是OO的标准,但是真的是这样吗?封装类体现的是oo分而治之的观念,不过是伴随OO的一种解决问题的方法罢了。嗬嗬,个人理解,可以砸。

2。类是属于OO的,而OO是独立于类的。定义了全局变量,只是封装不严格,上升不到面向对象的高度。顶多属于不符合面向对象精神罢了。

3。面向对象取代了面向过程吗?大家在编码的时候,类里面存在过程吗?方法里面有过程的体现吗?面向对象和面向过程,不过是事物的两种不同看法。同样拿耕地来做例子,好大好大的一块地,如果你只有一个耕地机器从头到尾工作下去,当然,这是一台机器工作的过程。现在,你有好多台机器,有了更好的方法,你决定把地划成很多块,每台机器耕作一块地。那么你划分的方式就是面向对象,但是具体每台机器工作,仍然是过程。这只是宏观和微观的区别。

另外:不是现在不能使用面向过程,而是因为软件越来越大,不得不把他们划分成很多块,然后逐个使用面向过程的方法。其实,面向对象是面向过程的封装。

以前咱们搞地球,现在搞太阳系了,但是搞地球还得面向对象。而划分成9个行星是面向对象,行星包括卫星是再次细分。卫星可以看作类吧。但是人在卫星里面的行动,绝对是过程

个人观点,欢迎扔砖
ClampHammer 2005-07-03
  • 打赏
  • 举报
回复
这个世界是没有万能的,包括编程语言和某种编程范型,
如果一味强求面向对象,反而会桎梏自己的思维, 如果所有人都是
这么想, 这个世界也就不会进步了.

你能说面向对象的就一定是好软件吗?
或者说好软件就一定只有面向对象才能产生的吗?

Booch说的对, 解决软件开发过程和复杂性问题,
未来几年不会找到更好的方法,但面向方面是它的一个补充.
对于2, 你一开始大可以把全局变量全局函数放到一个类里,如果在你以后写代码的过程中
如果发现类的职责不清,可以进行重构的. 我感觉只要你放了class 关键字在那里,他就是
一个类了,无非是你怎么看待这个类的问题, 是实现的好,还是比较糟糕.他满足基本的原则吗?
你也把它看成一个工具类,工具对象,这在现实生活中也是合理的.我感觉全局函数可以
全局变量则比较危险,当代码增加时,调试起来会相当困难.这时你可以重新考虑和此全局
变量相关的对象或类以及他们之间的关系,对代码按照比较成熟的模式进行重构.

所以我感觉软件开发过程中,面向对象思想不重要,而掌握面向对象方法的人最重要.
作为软件开发者, 生产高质量的软件是最重要的. 至于采用了什么方法,都是次要的.
只要是好的方法, 优秀的设计师都会采用.设计模式是我推荐楼主学的,如果你只会
模仿,只能说你还没理解模式的来龙去脉.先把它掌握了吧, 把他运用到你自己的项目中,哪怕
是虚拟一个场景,但也要是你自己思考过的.GoF的这本书是要反复去读的.当然,设计模式不止GoF的23种
还有很多优秀的设计模式,比如有很多对Visitor模式的扩展, martin.fowler的企业架构模式
也是值得学习的,但我感觉远没有GoF的美妙.
WilliamFire 2005-06-28
  • 打赏
  • 举报
回复
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义

面向对象本身只是一种思想,仅此而已,C++/JAVA/Smalltallk提供了实现面向对象描述的手段,可以更直接进行描述。就像菜刀可以砍树,用锯子也可以锯树,则是具体的工具选择了。没有继承与多态,不意味着就不是面向对象,现实证明,面向对象思想,最大的作用还是来自封装,可以方便地设置多种等级的信息可见形态,减少较大工程中的模板间相互交互造成的混乱与困惑。关于面向对象,至今都没有一个让大家都能接受的定义,各有其说。


2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?

全局函数与全局变量放入一个类,不是一个好的习惯,一般情况,应该视需要将这些函数与变量进行分组,这个分组的手段就是通过类来进行。“类”的关键在于分类,它是一种可以应用和表达的手段,明确这一点,就应该清楚了。

3.面向对象与面向过程是对立的还是相辅相成的?
准确地说,面向对象与面向过程间不存在原则上冲突,两者是各司其职的,在面向对象的思想中,面向过程也是必要的,面向对象不是万能的,许多问题它并不能解决好,面向对象主要是提供了一种思想层次上的套路,根据这种思想来进行模块的划分,而面向过程往往的思想,往往被容纳到了一个封装的模块之中,也就是说,在大体上可以依据对象思想来分析与研究系统,而在细节上的实现,可以在对象的领域之下应用面向过程的思想解决一些复杂的问题。

PS:
注意一下,面向对象,中心是对象,并不是类。
面向对象的语言,有以类为中心的,也是以对象为中心的,如java就是以类为中心,而oo javascript就可以看出许多以对象为中心的手法。
xielaixiangjx 2005-06-27
  • 打赏
  • 举报
回复
只说一句,不会面向过程,就别谈面向对象,不会面向对象就别做项目管理
developerly 2005-06-23
  • 打赏
  • 举报
回复
我也说说VB
其实VB本质来说应该是基于对象的,这也就是为什么里面有CLASS的关键字。但是却不是面向对象的语言。起码不支持继承和多态。我认为继承在面向对象的程序设计中是一个很重要的概念,所谓组件复用,framework的概念都是基于继承的基础之上的。
多态应该不算是面向对象的核心,但是它的确提供了重构或者增量开发中所需要的优雅的解决方案。
VB的产生本来微软是打算把它作为一个“胶水语言”用来粘合COM和ActiveX的,所以降低学习难度的代价,就是失去了很多有价值的feature。过程化时代中,初学者使用VB会被认为容易产生不好的编码习惯,遗憾的是在OOP时代,使用VB依然容易产生不好的编码习惯。
也许由于系统遗留问题还有大量的人在使用VB,不过出于对个人技术发展来说,还是不要研究VB的好。至于VB.net,可以说几乎就是C#的语言级映射,我没怎么用过,就不讨论了。
robin0000000 2005-06-19
  • 打赏
  • 举报
回复



学习
fzx 2005-06-17
  • 打赏
  • 举报
回复
anstern():

VB6似乎从语法上不支持继承和多态,所以不算OOPL.

如果各位大虾想用C、Vb6写出OO风格的程序来反驳的话,就不必了。
huxinpei 2005-05-31
  • 打赏
  • 举报
回复
其实偶认为所为的面向对象是一种”物件倒向“,就想搭积木一样
其实C里的象 STRUCT 就好象PUBLIC 申明的那样 他是一种功用部分


说道面向对象和面向过程,我感觉他们应该是相辅相成的,毕竟很多算法还是和我们
平时写的代码翻译成面向对象的语言而已
披星戴月 2005-05-31
  • 打赏
  • 举报
回复
学习
anstern 2005-05-28
  • 打赏
  • 举报
回复
我看大家没有举例说明vb,我来举例吧。
其实vb中就是一种面对对象的语言,只是MS把其简单化了,不容易让大家觉得其是oopl,
1.vb用到的控件,对于程序都是一个实例,只是它的类已经封装起来,大家看不到罢了
2.vb可以通过引用后,通过new来实例化一个对象
3.用户也可以自行定义类,如class module,通过new语句来实现类的实例化
如已定义了class1的module,添加public函数test,这样就可以在form里添加代码
Dim clsTest As New Class1
clsTest.test
Set clsTest = Nothing
happyjanezj 2005-05-14
  • 打赏
  • 举报
回复
up
nga96 2005-05-01
  • 打赏
  • 举报
回复
up
mis98ZB 2005-04-30
  • 打赏
  • 举报
回复
我也来说一下我的看法:

Q:
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义
A:
我认为使用结构化语言,也能够体现出面向对象的特征。

这个问题的基点在于什么是面向对象,什么叫做实现了面向对象。
封装/继承/多态,这些是面向对象的特征。
这些特征自然地出现在OOPL里。
这样一来,就可以说是OOPL实现了面向对象吗?
它们只是提供了一些体现面向对象特征的机制而已——而且还存在细节上的差别。
比如说对于封装,一下C++的friend的声明机制和java的package级私有机制就是两种完全相反的态度。
对于结构化的编程语言,你也可以采用某种idom,来体现面向对象的某些特征。
比如,利用static和头文件,你也可以搞个像模像样的封装;利用指针和强制造型,你也可以搞个继承(就像Gnome那样)。
对面向对象特征的支持没有出现在语言规范里,那它就不能出现在用这种语言编写的程序里了吗?

Q:
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
A:
面向对象概念上的类的精确定义我也不知道。
:(
根据我的理解,它是指一种抽象数据类型,一个类规定一个捆绑数据和操作的规范。
抛开继承机制不谈,OOPL中类主要为面向对象中的封装提供了支持。
但是,面向对象中的封装不仅仅是由类来实现的。
C++的namespace、java的package、C/C++的文件(static变量/函数)/头文件,都能对封装提供支持。
把全局函数,全局变量放入一个类,并没有破坏类作为一个封装单元的原则。
当然,如果类里边只有全局函数和全局变量,那么它实际上就等同于一个namespace了。

3.面向对象与面向过程是对立的还是相辅相成的?
A:
这个问题不知道怎么回答。
问题的关键在于什么是面向对象,什么是面向过程。
这一点stonespace(stonespace)已经说的非常清楚了。
就如《产生式编程》里说的,“现在面向对象的问题,就是它包含太多不是面向对象的东西”。
ClampHammer 2005-04-25
  • 打赏
  • 举报
回复
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?

全局变量放入类中是类的属性,类的属性(static)是所有对象共享的。

加载更多回复(25)

1,265

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 管理版
社区管理员
  • 研发管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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