免费注册 查看新帖 |

Chinaunix

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

[C++] 每多了解一点C++,就觉得C++面向对象的胜利就像tg夺取了政权 [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
21 [报告]
发表于 2013-01-10 14:09 |只看该作者
本帖最后由 shan_ghost 于 2013-01-10 17:12 编辑
captivated 发表于 2013-01-10 12:49

C++能抽象, C一样也能抽象, 所以, 我能否认为, 你想说的真实观点是, 某种程度上, C++的抽象能力比C好[抽象事物的工具比C多...]?


完全不是。

我的侧重点是“创建一个新的语义层”。

举例来说,游戏引擎可能会创建一个精灵/屏幕管理层,把动画、声音、碰撞检测等等统统抽象为针对精灵的某种操作(而不是神马类、判断、回调函数)。之后的设计,全都是针对精灵而不是C/C++/JAVA而做的。

类似的,GUI编程会抽象出窗口/事件语义层。


这些新的语义层本身是完备的、足以完成领域内所有需求的。使用者/维护者只需了解这个新的语义层即可。



至于C/C++呢,它们(以及python ruby java等等)也创建了一个特定的语义层。这个语义层是用来表述你为你的业务所创建的语义层的……



所以,想把程序写清楚,先决条件就是:必须先定义清楚自己的语义层,然后找一个和自己设计的语义层最“搭”的语言/库,把这个语义层实现出来。

对一些大的、复杂的项目,可能需要创建多个语义层:比如GDI层、MVC层、业务逻辑层、界面层。

只有每个语义层都清清亮亮,最终的软件才能条理清楚。


相反,流行的那些所谓的OO、所谓的设计模式,实质上是混淆了编程语言创建的语义层、语言对用户自定义语义层的支持,和用户自己的业务语义层本身。
一旦语义层出现含糊,自然导致软件实现的含糊甚至失败。

这种含糊常常来自于对OO、泛型、设计模式等等的误解。这就导致很多java/c++等支持OO的语言的使用者更容易写出扯淡的代码(与宣传相反)。且一个语言提供的语义越多,它就越容易被误用(于是linus发飙了)。
但,如果你真的能深刻理解自己的业务、并抽象出脱离语言的业务语义层,你自然就不会为特定的语言特性所累。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
22 [报告]
发表于 2013-01-10 14:53 |只看该作者
本帖最后由 shan_ghost 于 2013-01-10 17:19 编辑

嗯,上面说的可能太抽象了……来个形象点的吧。

都玩过格斗游戏吧?

嗯,前下前+按钮A=升龙拳;下前+按钮A=气功波……这个操作熟悉吧?

那么,请问,你和基友对战时,你是说“轻拳发升龙拳启动快、硬直短,不宜被反击”呢,还是“前下前+按钮A容易被后0.5秒然后前下前+按钮A或者按钮A/B/C或者……反击”?


前下前+按钮A 就是编程语言的语义层;升龙拳是格斗游戏业务的语义层。

作为游戏机,你只需、也只能了解编程语言这个语义层;而作为格斗玩家(程序员!),你应该使用属于游戏操作领域的语义层。


类似的,写一个GUI程序,你应该说“当鼠标点击yes/no按钮时,做什么什么”,而不是“当鼠标点击发生于屏幕上x1y1,x2y2这个矩形区域时,做什么什么”——后者是写GUI库的程序员的语义层,不是你的。

至于如何从鼠标点yes/no翻译 到 鼠标点某个矩形区域、乃至从系统外设发来的一个中断信号到中断处理程序、再到将这个信号转换成鼠标事件——自然应该由各自语义层的维护者处理。




类似的,你应该用业务术语这个语义层来描述自己的软件(而不是if/else);然后,再考虑如何用某种特定的语言来实现这些业务术语(也就是实现业务的语义层而不是业务本身,业务本身可以由业务的语义层自然完成或通过配置文件/高层脚本轻易扩展出来:这就是抽象的目的和意义)。
这样一来,写软件就简单了。而且除非语言过于变态、实现者过于脑残,否则怎么都做不烂的——这实际上也就是“先设计后编码”的意义所在(当然,注意“设计”和“先用某种语言打草稿”完全不是一回事)。

反之,如果直接用特定的语言来直接描述出特定业务,这种东西很容易写的随波逐流,最后都不知道歪哪里了。
尤其是被OO、泛型和设计模式毒害的人,以为用class打草稿就=设计了——事实上,他们根本就不懂什么是真正的抽象(抽象是创造一个新的语义层!),无非是另一种“有条理”的写到哪算哪罢了。

这类东西要能写的简单清晰,才叫出鬼了。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
23 [报告]
发表于 2013-01-10 15:08 |只看该作者
回复 22# shan_ghost


受教!

我只看过一点设计模式相关的,联系了一点网上的代码,感觉那些代码大部分是种误解

我很菜,说点个人的理解,我觉得被毒害或者说是自己误解的OOer,纠结于语言的应用方式,
而软件实现的角度讲,代码质量很大程度取决于设计,设计不是他们所谓的设计模式,而是分
层、或者分块,就是功能的抽象、分类。
这样来看的话,数据为中心还是方法为中心或者其他什么为中心并不重要,重要的是什么方法
给开发带来效率和方便。C的简洁和明确性,比C++的重重迷雾要易于消化得多,所以我宁愿
只使用C++的重载、has a,只用数据和方法封装在一起,而尽量少使用多态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP