免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cjaizss
打印 上一主题 下一主题

悲哀,这么多年来,我一直不知道什么叫面向对象 [复制链接]

论坛徽章:
0
91 [报告]
发表于 2010-02-25 16:07 |只看该作者
哈, 面向对象……


同时问问ls:应该如何改呢?那这个又如何改呢?
OwnWaterloo 发表于 2010-02-20 15:46



   太TMD有才了!

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
92 [报告]
发表于 2010-02-25 22:01 |只看该作者
这段没有看明白。
我举那个例子想表达的意思是很多人心目中那个OO是单分派的, 无法解决3p问题。
多分派我记得只在《modern c++ design》中提到过, 《exceptional c++》没有这方面的内容。

OwnWaterloo 发表于 2010-02-25 07:52



不是不是,你没有明白。
p.f(a1, a2, a3);
是隐含着一个主语的问题,问题是如果f是和a1,a2和a3的类型是同时声明的,那么f就同时是p,a1,a2,a3的一个接口!!!!!大家要注意一个非常重要的问题,那就是类的接口不一定只是类里面的函数!!类的接口的定义是:

以数据结构为参数,并和数据同时声明的函数都是类的接口,所以,OO不仅是一元关系,OO也可以表示多元分派。


下面是约定的问题。你举出的cmp的确是个约定,这涉及行为约定,而行为约定本身是对象的一个部分!!因此cmp是sort所操作类型的一个方法,是和操作类型紧密相关的,因此是操作类型的一个接口,所以你当然可以说这是OO的。我说了约定不一定是OO,但是你可以把约定看做是OO,他们在概念上是不矛盾的,但是它并不一定在物理上看见明显的class,interface,OO的概念并不需要是显式的。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
93 [报告]
发表于 2010-02-25 22:11 |只看该作者
回复  starwing83

本来我只是想针对这点:

说说的。

即使遇见那种情况, 也不需要借助interface解 ...
OwnWaterloo 发表于 2010-02-25 08:03



    这是显然的,interface又不是万金油,interface不能解决所有问题。我的意思是interface是个概念问题,你即使不写这个单词,这个思想也能指导你去组织代码。思想本身不会做任何事。它只是做事情的一个方法。你全都是interface不写一个if我看你怎么写代码。

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
94 [报告]
发表于 2010-02-25 22:39 |只看该作者
俺似懂非懂!

论坛徽章:
0
95 [报告]
发表于 2010-02-25 23:17 |只看该作者
而OO做了那些限制, 我上面也说过了: 不由硬件直接支持的软件协议, 单分派, 打包的接口类型。

OwnWaterloo 发表于 2010-02-25 06:32



实际上,现代的操作系统都在某种程度上支持OO的“协议”,当然这不算是“硬件”。

譬如ELF里面就有专为C++而设的初始化段,用于载入时执行一定的构造函数功能
即使如Dll这样的也有DLLMain,用于动态库被加载时的初始化。

不是底层系统不想支持多分派,多分派的实现代价不小,而且并不常用。
用硬件为一些糟糕的设计买单不太值得。

说完了,已经不想再就这个话题讨论下去了。剩下的都是观念、习惯还有水平的问题。

我还是继续搞我的Cx ~~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
96 [报告]
发表于 2010-02-26 02:24 |只看该作者
将max理解为容器的方法,跟处理 两元素的max 和 只有两元素的容器的max 难道就是格格不入泾渭分明的?
OO从来都不否认需要面向过程式的实现,但是面向过程式的声明和面向对象式的声明,效果则当然是截然不同的
xyfree 发表于 2010-02-25 15:13


容器可以有max(但不是必须的)。 两元素的容器当然也可以有。
记住, 关于这点的讨论是这样开始的:
1. 我在50楼先说max是一个过程而已, 没必要捏造出一个不需要的概念使得它更OO
2. 而你在51楼提出将max视为容器方法, 就很OO
我认为这个逻辑就是错误的, 容器的max是需要两元素的max去完成, 而不能将两元素的max推给容器去完成。

关于这个问题, 老抓你辫子伤你面子, 我也不多说什么了。


******我的观点不是"OO完全无用", 而是"OO不是万灵药"。 这也有错?
******我确实有错, 我不该费心费力的以为自己为软件理论发展作了贡献, 而实际上却残酷的剥夺"OO万能"者yy以及享受自己小世界中的宁静美好的权利……

你的观点没有错,但我难以理解你的做法。
难以理解的原因在于,你没有了解OO的某些优势,然后把这些OO可以解决的事情的解决办法寄托在其他技术上。
例如duck typing,在多数有OO解决方案的情况下引入duck typing,风险大,不实用。
说实话,我宁愿多写些代码,也不愿意留下一个要靠manual来维持的项目。
xyfree 发表于 2010-02-25 15:13


在你还没参与这贴时, 我就在29楼说出和粗字类似(也就是你引用我的发言部分)的观点。
根据这个观点, 我不知道你是如何得到红字部分的结论的。
你完全是在给我戴帽子 ——我讨论的就不是多数情况, 我举出的那些例子, 有哪一个是OO可以解决的???  当它不能解决的时候, 我提出另外的技术, 就不对了?

我难以理解你的逻辑。

btw: 难道你维护项目不靠manual吗? 那只会更危险。


当然就是要限制,我把所有compare需要用到的东西,在代码中说明出来
xyfree 发表于 2010-02-25 15:13


既然你是这种想法, 我也不和你争什么了, 你尽量去限制吧。


那你还是及早转行吧,我写过的代码从来都很无趣很枯燥。
有趣的从来都是做好的、没有隐患的、让大家都满意的软件成品。
xyfree 发表于 2010-02-25 15:13


我劝你才应该转行, 面得无趣枯燥的生活折你的寿。
你的逻辑有问题, 软件的质量不单单是语言和开发技术, 还有人。
C语言没有任何保姆功能, 你能说C语言不能开发出好的软件成品?

当然, 那些不愿学习, 不思进取, 一切都想找个依赖的人, 当然是开发不出来的。


那你何必写C代码呢,用0101就好了。
将原本01010可以做好的东西写成C代码。 可能你觉得很有趣? 哇哦, 又用了一个漂亮的函数?

你不觉得你很矛盾吗?一方面你希望别人用尽可能简单的语法--which同时使用不完善的声明,另一方面又希望自己完成尽可能炫或者有威力的功能--which依赖严谨的基础。
“这就是duck typing啊!” 我当然知道,可是实际上它没有你想象的那么美好。
xyfree 发表于 2010-02-25 15:13


你的逻辑又有问题, 在以下两个方面。
1. 我在上面批评你将简单问题复杂化 —— 原本函数指针就可以完成的事情, 非要去用一个模式。
“哇哦, 又用了一个模式”, 请体会里面的含义。

而你举的例子, 完全不能作为论据。
当我将0101写为函数的时候, 我确实可以很自豪的说: 嗯, 我将它们写成了一个函数。

在大部分情况下, 逻辑正常的人都会觉得函数比0101有趣, C比汇编有趣; 反之,将函数指针弄成strategy就不是人人都认为很有趣了, 在这个论坛尤其如此。
所以你的对仗, 完全是在骂你自己。


2. 我没有举出实际例子, 说明duck typing比interface更优雅
但我说过, 可以去搜, 我以前有说明为什么。
在那些情况下, 我确实可以再次自豪的说: 哇哦, 又用了一个duck typing。
如果你不服气, 我可以尽力构想一个例子出来, 但这要花时间, 你得等等。

而你将原本一个函数指针可以完成的事情弄成了一个strategy —— 这是一个fact。
“哇哦, 又用了一个模式”, 请再次体会里面的含义。

btw: 我可没有为了炫而去用什么特性, 我是在切切实实的提出OO不能完成的任务。
反而是你在用strategy。


从来都不拒绝看manual,说别人不看manual是你自己强加的观点。
manual的要求当然应该比编译器更严格,可是manual不会替你检查代码的,只有编译器会!
如果我不将程序的正确性寄托于编译器,难道我要寄托在manual上????
xyfree 发表于 2010-02-25 15:13


我要说好多遍你才清晰? 编译器能够检查到什么程度?
还别说编译器, 就连静态检查工具, 又能检查到什么程度?

我以前也很相信这些, 总是将msvc的等级开到/W4;  还会作出让步, 将原本没有错的代码, 改写成让编译器不抱怨的样子。
但某次我出于好奇, 用lint检查了一下我的代码…… 没有一处不是误报, 我确实每一处都仔细检查过, 真的, 全是误报。
之后我再也没有将msvc的等级开到/W4
我早就反感它的很多误报, 只是一直犹豫要不要降, lint是导火索。



实际上,现代的操作系统都在某种程度上支持OO的“协议”,当然这不算是“硬件”。
譬如ELF里面就有专为C++而设的初始化段,用于载入时执行一定的构造函数功能
即使如Dll这样的也有DLLMain,用于动态库被加载时的初始化。
xyfree 发表于 2010-02-25 15:13


偷换概念。
支持虚函数吗? 支持虚函数的硬件是主流吗?


不是底层系统不想支持多分派,多分派的实现代价不小,而且并不常用。
用硬件为一些糟糕的设计买单不太值得。xyfree 发表于 2010-02-25 15:13


不常用? 糟糕的设计?
shape::intersect是不是不常见? 是不是糟糕的设计?

你在做语言对吧, 而且还是和C++相关的。
我告诉你, C++的哲学之一就是相信程序员。 不要无端限制程序员的行为, 不要想当然的觉得什么是常用的什么是不常用的, 什么是有用的, 什么是无用的。
聪明的程序员自然会知道, 而且比你更清楚!

如果你希望将你认为不常用的, 易出错的特性砍掉, 以照顾工业需要; 没问题, 这不是什么错事。
但请记住, 你设计的就不是类C++, 而是类java。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
97 [报告]
发表于 2010-02-26 02:39 |只看该作者
如果f是和a1,a2和a3的类型是同时声明的,那么f就同时是p,a1,a2,a3的一个接口!!!!!大家要注意一个非常重要的问题,那就是类的接口不一定只是类里面的函数!!
starwing83 发表于 2010-02-25 22:01


你说对了的, 接口是客户和实现之间的交互方式, 它不一定就是interface(一种类型)。
但很多人都只认为interface(那个类型)才是接口, 我视图点醒这部分人。


OO不仅是一元关系,OO也可以表示多元分派。
starwing83 发表于 2010-02-25 22:01

这也是对的。
o.f(a1, a2, ... );  同样可以是一个"多分派"

但这样做还是得面临一个问题: 将谁放在句号前?

我觉得下面三行代码表达的意境完全不同:
he.fuck(her); // 传教
she.fuck(him); // 女上
fuck(he, she); // ml

你觉得呢?

我说了约定不一定是OO,但是你可以把约定看做是OO
starwing83 发表于 2010-02-25 22:01


你这就是在自欺欺人了。
是就是, 不是就不是, 为什么要看做是?
有什么好处?  就为了一切皆OO的信仰
抱歉, 我不具备这样的信仰。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
98 [报告]
发表于 2010-02-26 02:45 |只看该作者
这是显然的,interface又不是万金油,interface不能解决所有问题。我的意思是interface是个概念问题,你即使不写这个单词,这个思想也能指导你去组织代码。思想本身不会做任何事。它只是做事情的一个方法。你全都是interface不写一个if我看你怎么写代码。
starwing83 发表于 2010-02-25 22:11


是的, 将interface换成OO也是如此。
而我一开始就是持这个观点(在29楼)。

可惜将interface(OO)视为万金油的人有点多, 我看不下去了…… 就跑出来喊了两嗓子……


算了, 清醒的人自然清醒; 愚昧的人点拨也没用。
我还是低调点……  他们快乐, 我也落得清净。
无知是福……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
99 [报告]
发表于 2010-02-26 02:54 |只看该作者
我也倒了下带……
本来只是进来调侃两句的……
一时没忍住喊了两嗓子……  居然就吵起来了……

半点好处没捞着, 还被65楼看笑话……
以后还是低调行事

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
100 [报告]
发表于 2010-02-26 03:28 |只看该作者
你这就是在自欺欺人了。
是就是, 不是就不是, 为什么要看做是?
有什么好处?  就为了一切皆OO的信仰?
抱歉, 我不具备这样的信仰。
OwnWaterloo 发表于 2010-02-26 02:39




额,思想嘛,自欺欺人换个说法就是思维定势,再换个说法就是思维方式了。OO不就是一种思维方式么,限定一种思维方式优点就是可以考虑的范围可以减少很多,但是缺点也是很明显的,也不用我说了吧。有时候,自欺欺人也得了解一点,毕竟也是抽象的一种快捷方法,但是如果自欺欺人却不知道自己在自欺欺人偏以为是真理的就麻烦了。这就是传说的“思维坐井蛙”
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP