由于身处的行业环境,身边有很多做嵌入式的朋友,引发我对这两个问题的老生旧谈的思考。 个人观点:
这个所谓的面向对象思想其实不过是降低了行业的入门门槛罢了,实际上对于任何一段程序,一切归为函数。抽象画一个程序只是降低了记忆力门槛,因为你不需要记下来整个程序段的内容,都封装好了。但是函数、过程明显要高效严谨的多。 GOTO 是一个高效的语句,它和面向过程函数是相辅相成的, GOTO 其实就是 JMP SETJMP , JMP 允许你从程序的某一行跳到另一行, SETJMP 允许你从一个函数中跳到另一个函数中,它使得整个程序致密、高效、严谨,紧紧耦合在工艺上。 总之我身边的工程师每天都在写着这样严谨、美观、精致极富逻辑结晶的程序,调试控制实现着各种复杂的工艺,小到能源站大到酸奶生产线。听了一节 JAVA 视频,居然听到了这种认为 OOP 先进只支持 OOP 删除 GOTO 语句的程序设计语言,难怪它如此的低效低质。
101
tscat 2016-12-23 08:21:27 +08:00 via iPhone
面向对象是一种编程思想, goto 是一条语句。
如果你喜欢,我可以用一堆 goto 完成一个面向对象的开发。请问, 他的效率是高或者低? 顺便告诉你, c 真的可以进行面向对象开发。。 |
102
terence4444 2016-12-23 08:32:30 +08:00 via iPhone
简直是吃饱了没事干, JAVA 基本用于复杂的开发但实时性要求不高, OOP 好处就是便于维护。一个大型项目不 OO 的话,维护成本太高了。
在工控,单片机领域,一些场景对处理速度要求很高。有时候片段处理需要保证毫秒级不然下一个信号来了上个还没处理完就要出问题。这种情况下用 GOTO 提升性能也是正常的。但这样的代码规模不大,也不需要一定要 OOP 。 所以楼主是在没事找事,而且措辞难堪,回复完这条就 block 了。 |
103
000wangxinyu000 2016-12-23 09:07:01 +08:00
@nbhec2 Me against the world...
|
104
nbhec2 OP @cuebyte 孩子,我见过很多低智商的培训生来面试,和你的语风很像,这叫物以类聚人以群聚。我们不仅没丢饭碗而且还维护住了强大的市场这就是我们牛逼。有一句话你没说错,就是我们的工作不仅你这样自己都知道自己低能的人做不了而且就算把代码给你你也翻不了。市场还是我的,
|
107
wohenyingyu02 2016-12-23 09:45:38 +08:00
第一次听说面向对象可以降低入门难度的。。。楼主神童
|
108
hosiet 2016-12-23 10:17:35 +08:00 via Android
自动化科班出身也学了不少 CS 的人过来说几句:首先任何流行的东西都有其存在意义,这样就不能否认 OOP 的价值。然后工业控制和现在流行的 IT 领域确实不一样,人力成本与运行成本比例很不同,这决定了在传统控制领域宁愿多投入人力改进代码也不会选用快速开发但运行效率可能不够好的设计方式,对新技术的采纳也更加缓慢。
总之又是一个隔行如隔山的范例。 |
109
shyling 2016-12-23 10:56:42 +08:00
性能优化难道不该减少分支? goto 什么?
|
110
junzki 2016-12-23 14:19:35 +08:00
GOTO 也不是不能用, C 语言标准库中就有使用 GOTO 的地方。
不建议使用 GOTO 是因为有些人会滥用它,导致程序变得更加难以维护。 |
111
nbhec2 OP @shyling 用 GOTO 跳过不需要执行的行或直接跳进另一个函数的某一行执行一部分执行。
|
113
nbhec2 OP @shyling GOTO 是需要一行语句即可以飞跃到任意一行 IF ELSE WHILE 等语句可能要执行许多行
|
114
u13498 2016-12-23 17:45:39 +08:00
@nbhec2 不执行某段函数或者跳到另一个执行为什么不最小单元化函数,然后通过 return 和调用函数也能很好的实现啊,而且结构更加清晰,不是吗?当然,你说你用 goto 可以一个函数几百行代码跳来跳去我没话说,你让一个没看过这个代码的人来维护,你觉得结果会怎么样呢?然后,楼上也并没有说不允许使用 goto ,只是建议少用,如果业务需求非用不可(其实大部分人用 goto 就是偷懒,不想写那么多判断条件或者循环直接 goto 了,当然,有的复杂的逻辑使用条件或者循环会造成大量的冗余代码或者运行效率低下,比如底层驱动,这另说),那没人有意见。然后 goto 为什么要和 java 比,和 OOP 比呢?
|
115
u13498 2016-12-23 17:45:57 +08:00
@nbhec2 你说 GO 有 goto 。。。 go 最开始还不是用 C 一点一点构建出来的,所以保留 C 的特征很正常(不排除为了吸引 C 开发者),既然跟 C 类似,那就不能和 JAVA 做对比,跟 OOP 也没多大关系。如果你要说 OOP 一无是处,那请用 C 结构化编程写一个 Android 、 iOS 应用或者其他平台的图形化程序( iOS 和 Android 都支持 C ),嗯,这里说的是结构化。适用场景不同各有优势,不能以偏概全。哦,对了, LZ 你说你可以记住你写的所有代码,记不住自己写的所有代码就是辣鸡,那你知道敏捷开发吗?知道什么叫需求变更吗?
|
116
u13498 2016-12-23 17:49:06 +08:00
@nbhec2 你用 goto 之前不用判断?不判断的话一句调用也能解决啊,要跳出一个 break ,一个 return 不就解决了?
|
117
u13498 2016-12-23 18:01:34 +08:00
|
118
nbhec2 OP @u13498 我们是做中控的,还真是写驱动级程序的。另外我们需要经常回跳。几百行到是少见,但是几十到二百多行到是比较常见的。另外除了中控写嵌入式下位机时往往只能使用 GOTO(JMP/SETJMP)。我是在对 JAVA 的设计表示非常不认可并齐之改用 GOLANG 的总结
|
120
ghos 2016-12-24 12:53:43 +08:00
然而各种语言有各种语言的使用场景,GOTO 在某些场景是很有必要的对于另一些场景又显得没有那么必要 抛开使用场景来评价一个语言设计是不合理的。
|
121
v2exhehehehe 2016-12-26 14:25:23 +08:00
首先 c 是可以面向对象的,有兴趣可以看看 jserv 的 物件导向的 C ,在 Linux kernel 里面也有大量的范例。
一般 goto 用于基于返回值的错误处理(比如做一些清理)以及跳出深层的嵌套 |
122
ryd994 2016-12-26 15:45:38 +08:00 via Android
goto 在标准库和 Linux 内核里都不少见
主要用于 bailout cleanup 通常的准则是只用于这类用途 不控制运行逻辑,也不连续使用(每个逻辑分支最多一个,到函数尾) 另外,编程没有银弹。 oo 是很好用的设计,但并不是万能。工程师是以目标为导向,根据现有的条件,选择最优化的途径。 |
123
Balthild 2016-12-28 12:48:05 +08:00 via Android
@nbhec2 git 就是用 C 语言实现面向对象的例子之一。
另外,早期 C++编译器只是 C++到 C 的翻译器,这个你该不会不清楚吧? |
124
wysnylc 2017-01-20 17:25:10 +08:00
特意来上来骂你一句,沙比.
面向对象降低门槛真是第一次听说,这个真理你可以申请雨果奖. 低能的大脑无法装载程序?请问你的大脑能背多少字节的数据?怕是你的猪脑 1000 个 01 都背不下来. 趁早退出软件行业,至少别进入 java,有你这种智障在技术只会倒退不会进步. |