探讨几个入门级的面向对象小问题
学习OO不久,想请教大家几个问题
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
3.面向对象与面向过程是对立的还是相辅相成的?
看到大家都在这里讨论UML/ROSE/Pattern,小弟不才,问两个关于对象的问题
还望大家指教
问题点数:100、回复次数:45Top
1 楼nonocast(如果没有如果)回复于 2005-03-29 10:34:04 得分 0
没人来说几句吗?
欢迎技术争论Top
2 楼jerryf(object Sender)回复于 2005-03-29 11:47:28 得分 0
帮你顶上去Top
3 楼mintwlf(Programmer)回复于 2005-03-29 13:05:35 得分 0
面向对象是一种设计思想,不局限于具体的语言,不过C++可以更加准确方便地表示出这种思想。
全局函数和全局变量放入一个类,这个类从设计上讲也是面向对象的,因为它负责管理全局的变量和函数只是不是很好,通常把它们放在一个名称空间里面就OK了。
面向对象与面向过程是两种设计思想,通常在对象内部方法或者接口的实现过程中仍然是面向过程的,面向过程是一种处理方式,面向对象是系统设计的思想,他们之间是是相辅相成的。
Top
4 楼aboush(无人居)回复于 2005-03-29 15:26:54 得分 0
从开始来说,没有因为语言来涉及OO,反过来可能是对的,因为OO来设计语言.
面向对象是构造软件的视点,从对象来看问题域,并以对象的方法来提供解决方案.对象就象是细胞,他们互相影响.
从传统的OO来说,把一个变量放入类中,原因是类是拥有这个变量的专家(这个来自专家模式).
至于全局变量在OO里面没有这样的提法,但并不是没有这样的用法,比如static的.
对于OO和面向过程的关系,这两个不是完全的矛盾,但也不是完全符合.可以说有交集,但也有很大的不同.从设计,分析来说,面向过程没有能象OO那样理论化.
Top
5 楼redguardtoo()回复于 2005-03-29 17:48:34 得分 0
先找本《the c programming language》看吧,说别的都是浪费时间。Top
6 楼nonocast(如果没有如果)回复于 2005-03-29 18:02:20 得分 0
TO: redguardtoo
我不认为这是一种很负责任的行为
先找本《the c programming language》看吧,说别的都是浪费时间。
这算什么???
我无意与您发生争执,真的
但这样的回答好像有些过分
我C++专家分有14000+,专题游戏斑竹,我自认为我C和C++学得还是比较扎实的
你丢一句这个出来什么意思?
the c programming language哪一章节能解决我提出的问题,还希望阁下能指点Top
7 楼nonocast(如果没有如果)回复于 2005-03-29 18:08:18 得分 0
我很少提问题的,每提一个问题我都是仔细考虑过的,都不是心血来潮
我认为认真的提问,认真的思考,认真的回复这样才能提高
这个问题不是一下子就能回答上来的
要一些功底,要想一想
感谢mintwlf,aboush你们的回复
你们同时提到说非OO语言也能面向对象
只是我觉得都是简单的带过了
没举例说明
在umlchina中曾经看到过w_rose举过一个VB写的sort算法,但我记不清了Top
8 楼wtb2002(岩)回复于 2005-03-29 19:21:55 得分 30
激动!只能证明你内功还不到家!
真正项目中,国内完全按oo思想的程序很少!很多工程就是楼主2的做法!
个人认为:
面向对象注重的是管理!条例!和思维方法。
传统的c开发!维护量大,重用性低。导致后期投入高。
c++可以基本解决一些问题。
Top
9 楼nonocast(如果没有如果)回复于 2005-03-29 20:12:51 得分 0
学习编程好几年了
过去都是站在程序员的角度来写程序
也仅仅只是了解一些面向对象在OOPL中的用法
比如类,继承,多态。
还能套用一些设计模式。
但写多了代码,用多了模式才觉得自己只会临摹
正像楼上说的内功还不到家
缺少自己的思想
所以我静下心来在看一些OO的理论,充实自己
我们缺的是思考的方法,而不是模式
也希望大家一起讨论一下上面的问题
也欢迎大家到我的blog留言:blog.csdn.net/nonocastTop
10 楼showerXP(小阿!)回复于 2005-03-29 23:05:03 得分 50
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义
对于这个问题,可以不必深究也可以深究。不必深究是:一般认为,oopl至少支持1、被封装的对象2、类和实例的概念3、类间的继承4、多太。深究的是:看一种语言是怎么实现上面四点。c++,java,smalltalk,vb6(以前不支持多太),c都是分类分明。就不必多说。现在一些脚本语言语言变得模糊了。比如php5,封装、类、继承原来就有了,现在连interface都有了。知道oopl的精髓就可以了,也很少有人因为php5是否是oopl争论的脸红脖子粗的。
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
“全局函数,全局变量”在面向过程时代就是非常反对的。这种高度耦合是以后的“麻烦制造者”。很明显,它不符合封装的概念。不过“至于全局变量在OO里面没有这样的提法,但并不是没有这样的用法,比如static的.”我非常赞成。java里面的class.forname。还有模式里面的单列模式,就是运用了static特点。
3.面向对象与面向过程是对立的还是相辅相成的?
绝对不是什么相辅相成的。两者最重要的还是概念上的不同。在你用面向对象的方法建模的时候,就应该摒弃面向过程的思想。当然,用两者方法在最终功能实现代码上得到一些相似代码。但是决不能因为这一点就说“通常在对象内部方法或者接口的实现过程中仍然是面向过程的,面向过程是一种处理方式,面向对象是系统设计的思想,他们之间是是相辅相成的。”原来这里的斑竹o6z认为这是对oo的一种“肤浅”的认识。可能有点偏激,但是很能说明问题。
再仔细研究设计模式,应该会有一个“豁然开朗”的过程。Top
11 楼nonocast(如果没有如果)回复于 2005-03-29 23:19:53 得分 0
uups,非常感谢
To showerXP(小阿!)
对于您的第一个回复我还想再追问一下
回复中的oopl的精髓具体指什么?
类,对象,继承,多态,组合吗?还是有其它含义?
对于类似Singleton Pattern,或者说是static
其实也都是类似全局的
其区别在于这些全局的类只是暴露了其public的方法,隐藏了data
所以您非常赞成?Top
12 楼crashbluebird(撞人蓝鸟)回复于 2005-03-30 21:33:32 得分 0
看一下oo启思录Top
13 楼showerXP(小阿!)回复于 2005-03-31 16:23:06 得分 0
只是随便讨论。就不要说的怎么客气了。Top
14 楼showerXP(小阿!)回复于 2005-03-31 16:39:39 得分 0
面向对象,面向过程是方法论的问题。如果再提高一个层次就是世界观的不同。具体到某些语言的话,也就是不存在什么“资格”的问题。比如,你用中文表明你是一个“唯物观”者,用英文照样也可以表示。
各种语言的确保持着自己的特点。在中文简洁的文字表达的同时,我们却花费了很长的时间来实现计算机的中文输入问题。
oopl的精髓具体指什么?
在这里,我狭义的认为就是类和对象、继承、封装、多态。其中类和对象、继承、封装是基础特性,他们推导出多态的特性。几乎所有的模式都运用了多态。
Top
15 楼showerXP(小阿!)回复于 2005-03-31 16:53:05 得分 0
java里面static的出现就是为了表达一个全局的概念。这里可以有static的方法,也可以有static的数据。
但是,出现static的时候就要想一下这个全局的方法或者数据有什么物理意义。例如单例模式为什么要static?因为单列模式就是要产生一个唯一的对象,无论在什么地方调用他。Top
16 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-03-31 17:07:45 得分 0
对于全局,一般就只能放到一个统一的类中了Top
17 楼nonocast(如果没有如果)回复于 2005-04-06 16:49:51 得分 0
很多问题的回答还都是很含糊的
而且很多带星星的都没进来回几句
我感觉大家好像对这些概念也没有很好的认识
如果这样子的话
只能说很遗憾
或者说是一种悲哀
可能是大家不屑于回答这种问题
如果不屑
也留下言
我知道你不屑
谢谢
Top
18 楼stonespace(stonespace)回复于 2005-04-12 12:41:11 得分 20
搂主是初学者吧,不是说这些问题问错了,但这些问题的确是没有意义的。
其实没有“资格”的问题,号称面向对象是不需要资格的,谁都可以号称,如果C号称面向对象,我估计也不会有多少人出来批评,因为所谓“资格”的问题都是没有意义的。
软件工程和其他工程技术一样,都是实用主义的,对软件开发有意义的问题是,你的方法能够解决什么问题,不能解决什么问题。当然面向对象这个概念之所以有意义,是因为它声称面向对象的思想能够解决一些过去很困扰的问题,所以理解面向对象能够解决什么问题更重要。
当然有人提出OO范型,但是多数人都不知道OO范型,并不妨碍他们使用面向对象的方法。没有类的语言不符合OO范型,80年代90年代的OO宗教领袖似乎发明过一组方法,能够机械的用非OO语言实现OOAD生成的设计模型,但现在可能已经没有人记得这些方法,因为很少有人用这些方法。
当然你可以把全局函数,全局变量放入一个类,很多人都这样用过,不过按照UML对类的定义,这样的类不是一个UML定义的类。这个问题也不重要。其实这种用法大多数人都用过,说明这种用法的确能够解决某些问题,有某种好处,但是也没多少人主要用这种结构构造程序,说明这样的用法会有坏处。如果知道具体的好处和坏处是什么,那么我们在设计的时候就知道什么时候该这样用,什么时候不该这样用。
面向对象与面向过程是不是对立这个问题更没有意义,我都不太清楚什么是面向过程了,年代太久远,但不能说我们现在就完全没有用到面向过程的思想,如果有,那么这些思想可能已经改旗号,已经号称面向对象了。每一种新方法出来的时候,总要猛烈抨击旧方法,看那阵势就像是旧方法毫无是处,然后新方法无所不能,因为新方法要让人留下深刻印象,都会这样做,当年OO也这样批评面向过程的方法,但都会把旧方法中可以用的东西悄无声息的放进新方法里边,让后来人看起来,这些似乎都是新方法的内容,其实他们是旧的,只不过经过改头换面而已。
所以只用OO就够了,不要考虑什么相辅相成。
Top
19 楼nonocast(如果没有如果)回复于 2005-04-12 14:53:39 得分 0
看来又被BS了...Top
20 楼redguardtoo()回复于 2005-04-12 17:02:17 得分 0
>TO: redguardtoo
>我不认为这是一种很负责任的行为
>>先找本《the c programming language》看吧,说别的都是浪费时间。
不好意思,直接怎么想就怎么写了,没有注意措辞。
面向对象的定义是什么,讨论的如果是一种程序设计方法,我也许还懂一点。而且这种程序设计方法不是泛泛而谈。所谓不能“泛泛而谈”,我认为就是每个小的观点可以用十几行代码说清楚的。
我的一个小观点就是面向对象的程序设计技术有很多是基于面向过程的程序设计技术的(至少是看起来怎么那么象?)。而且在我参加的项目中,我大量使用的还是面向过程的程序设计技术,因为传统就是这样的(我读过的一些开源代码和书就是这样的)。
用C也可以实现对象(但是是否该称之为对象?因为类似的技术在C中以及其他语言中早就存在了)。
例如ADT(对应面向对象中的所谓封装):
typedef struct _myst{
int val1;
int val2;
}myst;
void interface1{myst*);
void init(myst*);
void destroy(myst*);
回调(对应多态?):
int sort( void* begin, void* end, int (* comp)(void* nd1, void *nd2));
继承在C中没法直接实现,不过都可以用委托模仿,另外继承本身是被滥用了。
所以我认为读《the c programming language》是很好的,我的意思是可以从经典书籍中体会一些程序设计的基本理念。否则可能会会打着“面向对象”的概念犯常识性的错误(例如数据隐藏?)。
这样应该算回答了问题1吧。更多的代码的例子可以参考我的blog:
http://blog.csdn.net/redguardtoo
>2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
>我们怎么来看待这个类,它还是不是面向对象中定义的类?
不明白把全局变量放在类里是什么意思,
int g; //全局变量
class mycls{
//类的一个成员,一般将其作为私有数据成员,否则就违反了数据隐藏的基本原理,
//
int g;
}
//全局变量,但g1.g是无法访问的,如果要直接访问g,那么为什么要把g放在一个类内呢?
mycls g1;
>3.面向对象与面向过程是对立的还是相辅相成的?
正如针对问题1的回答,我认为很多技术都是相辅相成的,你觉得它有用就行了:
以sort为例来说,通常我就硬编码比较函数
int sort(void* nd1,void* nd2)
{
comp(nd1,nd2);
}
如果sort函数要同时比较两个不同的函数,我就用回调(C++也可以用函数对象)
int sort(void nd1,void* nd2, int (*comp)(void*,void*);
如果除了比较还有别的什么操作,例如swap,那么我就用多态
class IOper{
virtual swap(void*,void*);
virtual comp(void*,void*);
virtual IOper(){};
}
int sort(void*nd1, void* nd2, IOper* interface1}
{
interface1->comp(nd1,nd2);
.....
interface1->swap(nd1,nd2);
}
如果我要使用别人的对象我一般使用委托而不是继承以获得最小的接口:
class else{
virtual void op1();
};
class mycls
{
private:
else* p;
}
int use_it(mycls* );
BTW:
我觉得讨论技术间的关系没有什么实用价值。如果真要进行有意义的讨论的话,我认为首先要搞清楚的是技术史。然后在占有足够的历史资料上,按照历史学的方法来讨论。据我所知,国内这方面好像没有什么独特的资料(中文的我只读过<面向用户的创新>,讲第一台商用计算机的产生过程的),互联网上的资料当然很丰富,我也不知道国内是否有计算机历史学家。
我的一点个人经验:
我也很有兴趣对于某些技术,做一些抽象的哲学上的思辨(而且我觉得这样做本该是很有意义的)。但是我的大脑曾经被国内的正规教育好好蹂躏了一番(哲学,方法论,一些社会科学的入门教育),只有彻底鄙视了我所受过的文科方面的教育(除了英语以外)后,我大概还能稍微进行一些抽象的思考。
Top
21 楼nonocast(如果没有如果)回复于 2005-04-12 21:00:13 得分 0
got it
其实我不是要专牛角尖的人
我很BS那些专牛角尖的人
可能我认为唯有深入才能浅出吧
很多时候发觉都是在OO和FO中徘徊
我大概也只能说OO是FO的净化吧Top
22 楼hanfeichunan(病态天使)回复于 2005-04-23 11:28:55 得分 0
用c完全可以实现面向对象的设计,不会的人用c++和java也写不出面向对象的程序
,参考的开源项目rat(robust audio tools)Top
23 楼builder007(半边坏人)回复于 2005-04-24 04:20:13 得分 0
有什么好争论的?看多几本书不就明白了?
面向人类的 才值得研究Top
24 楼nonocast(如果没有如果)回复于 2005-04-24 11:48:07 得分 0
面向人类?
这个好像挺新鲜的
Top
25 楼happyjun2000(蓝色游侠∮是非成败转头空)回复于 2005-04-24 21:31:42 得分 0
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义
re:面向对象是思想,如果说面向对象的编程语言,那只是提供了一种更好实现和表述的方法
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
re:那不就是static吗
3.面向对象与面向过程是对立的还是相辅相成的?
re:都是有用的,在不同环境下各有优略Top
26 楼ClampHammer(Reading,thinking and coding)回复于 2005-04-25 12:38:18 得分 0
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
全局变量放入类中是类的属性,类的属性(static)是所有对象共享的。
Top
27 楼mis98ZB(Effective Typer)回复于 2005-04-30 13:38:21 得分 0
我也来说一下我的看法:
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)已经说的非常清楚了。
就如《产生式编程》里说的,“现在面向对象的问题,就是它包含太多不是面向对象的东西”。Top
28 楼nga96(因为我笨,所以努力。陈勇华)回复于 2005-05-01 21:01:56 得分 0
upTop
29 楼happyjanezj(jane)回复于 2005-05-14 21:18:22 得分 0
upTop
30 楼anstern()回复于 2005-05-28 13:53:41 得分 0
我看大家没有举例说明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
Top
31 楼huxinpei(pro_love3000)回复于 2005-05-31 12:16:16 得分 0
其实偶认为所为的面向对象是一种”物件倒向“,就想搭积木一样
其实C里的象 STRUCT 就好象PUBLIC 申明的那样 他是一种功用部分
说道面向对象和面向过程,我感觉他们应该是相辅相成的,毕竟很多算法还是和我们
平时写的代码翻译成面向对象的语言而已Top
32 楼Lintops(披星戴月)回复于 2005-05-31 14:22:38 得分 0
学习Top
33 楼fzx(找工作ing(C++/linux))回复于 2005-06-17 10:10:18 得分 0
anstern():
VB6似乎从语法上不支持继承和多态,所以不算OOPL.
如果各位大虾想用C、Vb6写出OO风格的程序来反驳的话,就不必了。Top
34 楼robin0000000(一股暖风吹我心!!)回复于 2005-06-19 15:19:22 得分 0
学习Top
35 楼developerly(阿阳)回复于 2005-06-23 11:27:52 得分 0
我也说说VB
其实VB本质来说应该是基于对象的,这也就是为什么里面有CLASS的关键字。但是却不是面向对象的语言。起码不支持继承和多态。我认为继承在面向对象的程序设计中是一个很重要的概念,所谓组件复用,framework的概念都是基于继承的基础之上的。
多态应该不算是面向对象的核心,但是它的确提供了重构或者增量开发中所需要的优雅的解决方案。
VB的产生本来微软是打算把它作为一个“胶水语言”用来粘合COM和ActiveX的,所以降低学习难度的代价,就是失去了很多有价值的feature。过程化时代中,初学者使用VB会被认为容易产生不好的编码习惯,遗憾的是在OOP时代,使用VB依然容易产生不好的编码习惯。
也许由于系统遗留问题还有大量的人在使用VB,不过出于对个人技术发展来说,还是不要研究VB的好。至于VB.net,可以说几乎就是C#的语言级映射,我没怎么用过,就不讨论了。Top
36 楼xielaixiangjx(谢香)回复于 2005-06-27 17:29:55 得分 0
只说一句,不会面向过程,就别谈面向对象,不会面向对象就别做项目管理Top
37 楼WilliamFire(寒枫天伤)回复于 2005-06-28 12:04:55 得分 0
1.面向对象是不是只有在OOPL中实现,我指的就是他们最少必须支持类这个概念
换句话说是不是只有C++/JAVA/Smalltalk etc.这样支持类的语言才有资格面向对象
而那些不支持类,诸如VB6,C就不可能面向对象?如果可以请举例说明,并说明阁下对面向对象的定义
面向对象本身只是一种思想,仅此而已,C++/JAVA/Smalltallk提供了实现面向对象描述的手段,可以更直接进行描述。就像菜刀可以砍树,用锯子也可以锯树,则是具体的工具选择了。没有继承与多态,不意味着就不是面向对象,现实证明,面向对象思想,最大的作用还是来自封装,可以方便地设置多种等级的信息可见形态,减少较大工程中的模板间相互交互造成的混乱与困惑。关于面向对象,至今都没有一个让大家都能接受的定义,各有其说。
2.如果将全局函数,全局变量放入一个类,即成为这个类的方法和属性
我们怎么来看待这个类,它还是不是面向对象中定义的类?
全局函数与全局变量放入一个类,不是一个好的习惯,一般情况,应该视需要将这些函数与变量进行分组,这个分组的手段就是通过类来进行。“类”的关键在于分类,它是一种可以应用和表达的手段,明确这一点,就应该清楚了。
3.面向对象与面向过程是对立的还是相辅相成的?
准确地说,面向对象与面向过程间不存在原则上冲突,两者是各司其职的,在面向对象的思想中,面向过程也是必要的,面向对象不是万能的,许多问题它并不能解决好,面向对象主要是提供了一种思想层次上的套路,根据这种思想来进行模块的划分,而面向过程往往的思想,往往被容纳到了一个封装的模块之中,也就是说,在大体上可以依据对象思想来分析与研究系统,而在细节上的实现,可以在对象的领域之下应用面向过程的思想解决一些复杂的问题。
PS:
注意一下,面向对象,中心是对象,并不是类。
面向对象的语言,有以类为中心的,也是以对象为中心的,如java就是以类为中心,而oo javascript就可以看出许多以对象为中心的手法。
Top
38 楼ClampHammer(Reading,thinking and coding)回复于 2005-07-03 15:21:43 得分 0
这个世界是没有万能的,包括编程语言和某种编程范型,
如果一味强求面向对象,反而会桎梏自己的思维, 如果所有人都是
这么想, 这个世界也就不会进步了.
你能说面向对象的就一定是好软件吗?
或者说好软件就一定只有面向对象才能产生的吗?
Booch说的对, 解决软件开发过程和复杂性问题,
未来几年不会找到更好的方法,但面向方面是它的一个补充.
对于2, 你一开始大可以把全局变量全局函数放到一个类里,如果在你以后写代码的过程中
如果发现类的职责不清,可以进行重构的. 我感觉只要你放了class 关键字在那里,他就是
一个类了,无非是你怎么看待这个类的问题, 是实现的好,还是比较糟糕.他满足基本的原则吗?
你也把它看成一个工具类,工具对象,这在现实生活中也是合理的.我感觉全局函数可以
全局变量则比较危险,当代码增加时,调试起来会相当困难.这时你可以重新考虑和此全局
变量相关的对象或类以及他们之间的关系,对代码按照比较成熟的模式进行重构.
所以我感觉软件开发过程中,面向对象思想不重要,而掌握面向对象方法的人最重要.
作为软件开发者, 生产高质量的软件是最重要的. 至于采用了什么方法,都是次要的.
只要是好的方法, 优秀的设计师都会采用.设计模式是我推荐楼主学的,如果你只会
模仿,只能说你还没理解模式的来龙去脉.先把它掌握了吧, 把他运用到你自己的项目中,哪怕
是虚拟一个场景,但也要是你自己思考过的.GoF的这本书是要反复去读的.当然,设计模式不止GoF的23种
还有很多优秀的设计模式,比如有很多对Visitor模式的扩展, martin.fowler的企业架构模式
也是值得学习的,但我感觉远没有GoF的美妙.Top
39 楼fanweiwei(黑暗凝聚力量,堕落方能自由)回复于 2005-07-05 11:48:09 得分 0
markTop
40 楼seandsky(路人甲)回复于 2005-07-05 17:45:00 得分 0
1。 其实,OO是一种分析问题的方法,语言是解决问题的工具。
当你已经分析了某个问题之后,就需要选择一个合适的工具。这就好比是耕地,确定好了播种的土地,你就需要确定使用自动化的耕作还是手工犁作。
只存在工具是否合适的问题。都可以耕地,只是哪个更适合。同样,都可以用来搞面向对象,只是看你怎么看待问题。或许是否有类就是OO的标准,但是真的是这样吗?封装类体现的是oo分而治之的观念,不过是伴随OO的一种解决问题的方法罢了。嗬嗬,个人理解,可以砸。
2。类是属于OO的,而OO是独立于类的。定义了全局变量,只是封装不严格,上升不到面向对象的高度。顶多属于不符合面向对象精神罢了。
3。面向对象取代了面向过程吗?大家在编码的时候,类里面存在过程吗?方法里面有过程的体现吗?面向对象和面向过程,不过是事物的两种不同看法。同样拿耕地来做例子,好大好大的一块地,如果你只有一个耕地机器从头到尾工作下去,当然,这是一台机器工作的过程。现在,你有好多台机器,有了更好的方法,你决定把地划成很多块,每台机器耕作一块地。那么你划分的方式就是面向对象,但是具体每台机器工作,仍然是过程。这只是宏观和微观的区别。
另外:不是现在不能使用面向过程,而是因为软件越来越大,不得不把他们划分成很多块,然后逐个使用面向过程的方法。其实,面向对象是面向过程的封装。
以前咱们搞地球,现在搞太阳系了,但是搞地球还得面向对象。而划分成9个行星是面向对象,行星包括卫星是再次细分。卫星可以看作类吧。但是人在卫星里面的行动,绝对是过程
个人观点,欢迎扔砖Top
41 楼lovebanyi(风云)回复于 2005-07-05 19:01:33 得分 0
就谈一点.我所知道纯面象对象的语言C#中是没有全局变量和函数.微软推荐用静态变量和函数代替它Top
42 楼g961681(技术庸人(情商太低))回复于 2005-07-06 08:58:08 得分 0
```````````Top
43 楼yhb7805(codingMouselet)回复于 2005-07-12 11:16:27 得分 0
我个人觉得OO是考虑问题的角度和OP不一样,OO是从应用的角度出发,而OP是从程序的角度出发,《THINK IN C++/JAVA》里对这个讲解的更明白,可惜我还没有深刻体会。
如果是OOD的话,个人认为更应该注重抽象和封装;而在OOP的阶段,才更注重具体实现语言的特点,所以我认为至少在OOD阶段,是不用考虑语言本身的(至少语言本身不是重点)。Top
44 楼nonocast(如果没有如果)回复于 2005-07-13 14:55:38 得分 0
可能OO的核心就是抽象
提取稳定的接口
从人观察的角度出发Top
45 楼awuzi(阿无知)回复于 2005-07-13 22:52:06 得分 0
本来不太懂,看过之后还是不太懂
看样子要多看书,多实践了
谢谢各位在讨论中提到了那么多经典书籍,一定拿来看Top




