问:为什么要面向对象编程?
oop有什么优点?有缺点吗? 这个问题你说呢我个人觉得
1 后续高校性
2 功能相互独立性 或易扩展性
3 良好测试性和可维护性
缺点有时出现在继承里
由于过多继承尤其是多重继承可导致产生迪卡耳式的类集合的爆炸
[ 本帖最后由 wero 于 2005-10-31 18:01 编辑 ] 原帖由 wero 于 2005-10-31 17:52 发表
缺点有时出现在继承里
由于过多继承尤其是多重继承可导致产生迪卡耳式的类集合的爆炸
这个问题似乎不是OOP自己产生的。因为你有那么多需求,自然会需要那么多实现。
如果没有继承,情况可能更遭,模块之间会有大量的重复代码。 这个问题你说呢
上次面试问到这个,我说是增强程序可扩展性,面试的人说我的理解和他们的认识有差距 后续高校性
何解?可扩展? 良好测试性和可维护性
可以分块测试和维护? try "google".
-------------------------------------------------
One of the main advantages of OO programming is its ease of modification; objects can easily be modified and added to a system there by reducing maintenance costs. OO programming is also considered to be better at modeling the real world than is procedural programming. It allows for more complicated and flexible interactions. OO systems are also easier for non-technical personnel to understand and easier for them to participate in the maintenance and enhancement of a system because it appeals to natural human cognition patterns.
For some systems, an OO approach can speed development time since many objects are standard across systems and can be reused. Components that manage dates, shipping, shopping carts, etc. can be purchased and easily modified for a specific system. 原帖由 gaga 于 2005-10-31 21:22 发表
这个问题似乎不是OOP自己产生的。因为你有那么多需求,自然会需要那么多实现。
如果没有继承,情况可能更遭,模块之间会有大量的重复代码。
现在更加推荐的是成员引用
继承当然不能没有 但很容易滥用
另外 没有继承会造成大量的重复代码的结论是不对的继承为了消除重复代码是很老的观点 在结构化编程中一样可以写非常精简的程序现在看来 继承真正的目的是为了多态性
以上观点 我觉得和经验有关 和知识无关 原帖由 tadios 于 2005-10-31 21:38 发表
可以分块测试和维护?
所有的结构化程序一样可以分快测试
现举例说OO
OO的优点在 其可以把不相关的模块各自的行为互相分离地抽象出来 这样 新加入模块时候 代码基本很少甚至不需要改动 只把新代码直接通过由虚基类或接口或抽象类等继承及其实现即可 原帖由 wero 于 2005-10-31 22:52 发表
现在更加推荐的是成员引用
继承当然不能没有 但很容易滥用
另外 没有继承会造成大量的重复代码的结论是不对的继承为了消除重复代码是很老的观点 在结构化编程中一样可以写非常精简的程序现在看来 继 ...
我现在写程序仍然是遇到功能需要扩展的时候,直接继承已经实现的类。
不清楚你说的如何通过‘结构化编程’使用实现功能派生而不重复编码。
如果是定义新的类,操作那些已经实现的类的实例, 在类的数量上并没有改善。在访问已经实现的功能函数的时候也没有编码上的优势。
多态性是虚函数继承的另外一个好处,有时候很有用,可是用相同的代码操作不同的派生类的情况并不多,可能和编程习惯有关。
(只针对C++编程而言) 原帖由 wero 于 2005-10-31 23:02 发表
现举例说OO
OO的优点在 其可以把不相关的模块各自的行为互相分离地抽象出来 这样 新加入模块时候 代码基本很少甚至不需要改动 只把新代码直接通过由虚基类或接口或抽象类等继承及其实现即可
exactly 原帖由 gaga 于 2005-10-31 23:44 发表
我现在写程序仍然是遇到功能需要扩展的时候,直接继承已经实现的类。
不清楚你说的如何通过‘结构化编程’使用实现功能派生而不重复编码。
如果是定义新的类,操作那些已经实现的类的实例, 在类的数量上并 ...
打个具体的比方吧
可以用一个static类替代 需要重复的不包含实例变量和上下文信息的代码
更土的办法是使用全局变量和函数哈哈
[ 本帖最后由 wero 于 2005-11-1 23:24 编辑 ] 可不可以这样认为,
结构体
{成员变量+函数指针}=对象?
继承和重载我认为也是可以用C来实现。
记得最初的C++编译器实现就是先转换成C。
再调用C的comilper的。
面向对象不是必须,只是一种为了构造大规模的软件系统的手段。 原帖由 Marvin 于 2005-11-3 01:30 发表
可不可以这样认为,
结构体
{成员变量+函数指针}=对象?
继承和重载我认为也是可以用C来实现。
记得最初的C++编译器实现就是先转换成C。
再调用C的comilper的。
面向对象不是必须,只是一种为了构造大规模的 ...
实质上也可以这么说吧
如果你的意思是c++是c的一个shell的话
但我人为还是不要用指针的逻辑来理解c++和c的关系
因为c++不是第一个也不是最成功的面向对象的语言
smalltalk或现在基于vm的如c#或java 其语言本身就直接支持对象的引用,
而不是通过pointer...当然从原理上讲所有这些都是用c语言写的 原帖由 Marvin 于 2005-11-3 01:30 发表
可不可以这样认为,
结构体
{成员变量+函数指针}=对象?
继承和重载我认为也是可以用C来实现。
记得最初的C++编译器实现就是先转换成C。
再调用C的comilper的。
面向对象不是必须,只是一种为了构造大规模的 ...
结构是不能继承的,只有类才可以继承。C编不出真正的OOP来。 原帖由 AceRed 于 2005-11-3 18:44 发表
结构是不能继承的,只有类才可以继承。C编不出真正的OOP来。
C 在语法上不支持继承。
但可不可以写一个宏。
将public这样的“关键字”,替换成类似于inline的操作。
就是将base class的内容先拷贝到新的struct的位置。
做成一个欠套的struct.
然后访问的时候用 subclass.bassclass.basemember=xxxx;
这样的方式进行?? all for reuse! with reuse u can drop down your implement- and maintenance-cost,some more important is to avoid the error, because u are human, u must make some mistakes with writing new code. with oop u can reuse some fine tested class and more efficient to design your programm.
Anyway, if u want to programm with hardware, graphic processing, pattern procssing, then u can forget OOP. On this way the performace is more important as designing code with a good structure. 原帖由 woo2333 于 2005-11-4 00:39 发表
all for reuse! with reuse u can drop down your implement- and maintenance-cost,some more important is to avoid the error, because u are human, u must make some mistakes with writing new code. wit ...
oops...
www.inputking.com 这个网站不错,有时候可以应急 原帖由 Marvin 于 2005-11-3 21:33 发表
C 在语法上不支持继承。
但可不可以写一个宏。
将public这样的“关键字”,替换成类似于inline的操作。
就是将base class的内容先拷贝到新的struct的位置。
做成一个欠套的struct.
然后访问的时候用 subcl ...
不过好象挺难的 你总不能连语法括号都定义个宏吧
毕竟宏是死的啊 你写了一个struct后 就必须根据它写一个#define:lol::lol::lol:
不过还是 挺有创意的 哈哈
$不错$ 原帖由 woo2333 于 2005-11-4 00:39 发表
all for reuse! with reuse u can drop down your implement- and maintenance-cost,some more important is to avoid the error, because u are human, u must make some mistakes with writing new code. wit ...
I agree with the most what u said, but I do not think the c++ coulddecrease the efficiency obviously. Currently I am implementing an rt-embedded appliation based on c++. its speed seems also very cool.
Actually if someone makes/complieshis c- program usingc++ complier, it is also okey!
It means, the key for speed is not what language you make use of but how good your algorithem and code are!:lol:
[ 本帖最后由 wero 于 2005-11-6 00:14 编辑 ] 已经有很多文章讨论了c++的效率问题。通常的观点是和c相比会损失不超过10%的执行效率。
而c++的开发效率是高于c相当多的(这个似乎很难定量衡量),当然是指至少有一定规模的项目,HelloWorld之类的显然不在此列。
C++编译器都是向下兼容c程序,只是加了一些更加严格的语法限制。比如函数必须先有声明才可以引用。而不是c里面会给一个默认的函数类型让你编译通过。 原帖由 wero 于 2005-11-5 23:42 发表
不过好象挺难的 你总不能连语法括号都定义个宏吧
毕竟宏是死的啊 你写了一个struct后 就必须根据它写一个#define:lol::lol::lol:
不过还是 挺有创意的 哈哈
$不错$
挺简单的阿,这样你看行不行
#define PUBLIC (x) struct x
struct sublclass{
PUBLIC (baseClass);
,,,
}
其实跟这样也差不错
struct sublclass{
struct baseClass;
,,,
}
其实我想继承应改也差不多就是这样实现的。
C++编译器在后台做得最多的可能是构造,析构那一套。
自动就被调用了。。很神。;) 原帖由 Marvin 于 2005-11-10 15:01 发表
挺简单的阿,这样你看行不行
#define PUBLIC (x) struct x
struct sublclass{
PUBLIC (baseClass);
,,,
}
其实跟这样也差不错
struct sublclass{
struct baseClass;
,,,
}
其实我想继承 ...
稍微想一下你就可以明白,用这种方式 可能产生无数举不胜举的不可预见的错误,任意一个c++中很正常的使用都会因为宏的不全面性或人为的错误 而导致错误
我指用宏,所以技术上我只能说具备不可 或难实现性,在业务时间玩玩尚可$汗水$
如果一定要用c来描述c++或对它感兴趣的话,
我建议你可以先仔细的定义 c++语言的BNF,如果你仅仅需要看看继承等特性是如何实现的
那么就定义一部分就好了
并通过YACC等工具来生成C代码的关于结构或继承部分的描述
然后打开开一下YACC生成的结果代码就可以了
说实在的,人为地用脑子想用c来描述c++ 有点象在有了飞机非要骑马:lol::lol:
至于继承,理论上当然是是肯定要用c的函数指针的:lol::lol:
[ 本帖最后由 wero 于 2005-11-10 16:37 编辑 ] 原帖由 wero 于 2005-11-10 15:54 发表
稍微想一下你就可以明白,用这种方式 可能产生无数举不胜举的不可预见的错误,任意一个c++中很正常的使用都会因为宏的不全面性或人为的错误 而导致错误
我指用宏,所以技术上我只能说具备不可 或难实现性,在业 ...
偶也不是想用C来实现C++,只是说OO里面的继承和重载的思路都可以用在C里面。
比如可以用
struct subclass{
struct baseclass
{}
}模拟继承。(当然重写public关键字是有点变态)
不过偶不太认同继承是由从函数指针过来的。
记得原来看一本书上写的子类的内存布局。
就是复制了基类的数据,再加上自己的成员。
所以我想应该是嵌套的struct
好像是清华的教材。。。。
而且,我觉得思考对象的实现机制还是有意义的。
比如对象的大小有些情况下还是要考虑的(序列化)
OO说到底还是为了重用。提高开发效率。就不可避免的会有冗余。
而且现在重用的机制也不只OO,还有组件技术,STL之类东东。。
OO也许是一种开发效率与性能的折衷吧。
偶其实不是学INFO的只是学习工作中用到一些coding。
wero大虾的说的很多名词
俺都不太懂。。
以上只是一点愚见,一点OO的反思跟大家交流。。 原帖由 Marvin 于 2005-11-10 23:32 发表
偶也不是想用C来实现C++,只是说OO里面的继承和重载的思路都可以用在C里面。
比如可以用
struct subclass{
struct baseclass
{}
}模拟继承。(当然重写public关键字是有点变态)
不过偶不太认同继承 ...
解释几个名词
BNF 巴斯科范式 形式语言语法的一种描述方式
基本对应上下文无关文法或下推机
YACC 最早是UNIX下的实用工具 用于文法识别和解析使用 一般配合LEX
LEX词法分析程序生成器 对应线性文法或有限机
以上是编译系统的前端的标准工具可以说任何语言在文法层次上都是基于以上办法
这两个工具在WIN上也都有提供
至于你说的内存布局因为已经带上下文信息
所以我个人认为其实已经脱离文法研究范畴外,当然有时侯这种东西也要看具体的
不同版本的前端生成程序如YACC的实现质量,
具体是否如你所说,建议可以通过以上用生成基于c的c++后再研究
另 你对OO的看法我有些是赞同的,有些我也只是感觉,比如说我觉得大部分情况下在序列化时候没有关心对象大小的必要,因为
1持久化媒体要比内存对象廉价的多
2 Serialize的成功与否多在各个对象内部可以自定义,根据具体情况来采取是原子操作还是一般地操作
当然有特殊情况会可能非考虑不可
[ 本帖最后由 wero 于 2005-11-11 11:45 编辑 ] 原帖由 wero 于 2005-11-11 11:41 发表
解释几个名词
BNF 巴斯科范式 形式语言语法的一种描述方式
基本对应上下文无关文法或下推机
YACC 最早是UNIX下的实用工具 用于文法识别和解析使用 一般配合LEX
LEX词法分析程序生成器 对应线性文法或有限机 ...
$不错$$不错$
感谢wero大虾指教。
好像是说编译原理吧,,这个东东确实很高深。
不懂不懂。。:)
但我觉得大虾一直误会我的意思了。
我并不是想设计一个基于C的C++compiler或提供广泛的C++语义支持。
我只是说我们可以通过改变编程风格,来在以一定程度上的模拟对象的行为。
其实一个简单的sizeof就可以看出对象的大小。
再加上&取地址操作,我想弄明白一个对象的内存布局并不太困难。
我的看法是。对象在内存中,一定是序列化存储的。这样的话,我们的必然可以用C这样的面向过程语言构造出这样存储结构。
而另一方面,面向过程最大的问题就是不支持
object.method()这样的操作。而C里面提供了函数指针,所以在C里面可以用函数指针作为成员来封装类似的操作。
总结一下我的观点:OO的作用就是方便的重用。并由此衍生出一大堆RAD,类库(MFC等),和自动建模的工具。并且使软件开发产业化。还产生了所谓高级蓝领。。
我所强调的是我们不应当过分依赖OO,而应该了解底层的机制。至少老板让你设计一个OO的协议的时候,你应该清楚的知道你的object的大小。了解地层还有一个好处,就是方便debug,尤其是汇编级别的debug。
当然,以上的描述我可能用的是一种比较原始的方式。wero老大就看得远多。学习学习:) 原帖由 Marvin 于 2005-11-11 13:51 发表
$不错$$不错$
感谢wero大虾指教。
好像是说编译原理吧,,这个东东确实很高深。
不懂不懂。。:)
但我觉得大虾一直误会我的意思了。
我并不是想设计一个基于C的C++compiler或提供广泛的C++语义支持。
...
我倒没有让你构建编译器的意思
我只是想你能最好通过用YACC描述一下你的疑问,简单通过看代码来解释你的疑问比如说对象继承是否在c级别上是转换成结构考贝,
比如成员引用是否在c级别上是转换成涵数指针什么的(这个我估计肯定是)$鼓励$
毕竟猜测总是猜测,你也不必要做整个语言你哪部分有疑问就生成哪部分,其实方便的很
而且,现实中的基于不同语言转意的编译,也不可能通过使用手工编写程序来互相转化
另外具体c++的BNF或CFG很多c++书后都有抄过来就是
[ 本帖最后由 wero 于 2005-11-11 14:20 编辑 ]
页:
[1]