OOP 思想真的很先进吗 GOTO 真的不能用吗

2016-12-22 09:52:55 +08:00
 nbhec2

由于身处的行业环境,身边有很多做嵌入式的朋友,引发我对这两个问题的老生旧谈的思考。 个人观点:

这个所谓的面向对象思想其实不过是降低了行业的入门门槛罢了,实际上对于任何一段程序,一切归为函数。抽象画一个程序只是降低了记忆力门槛,因为你不需要记下来整个程序段的内容,都封装好了。但是函数、过程明显要高效严谨的多。 GOTO 是一个高效的语句,它和面向过程函数是相辅相成的, GOTO 其实就是 JMP SETJMP , JMP 允许你从程序的某一行跳到另一行, SETJMP 允许你从一个函数中跳到另一个函数中,它使得整个程序致密、高效、严谨,紧紧耦合在工艺上。 总之我身边的工程师每天都在写着这样严谨、美观、精致极富逻辑结晶的程序,调试控制实现着各种复杂的工艺,小到能源站大到酸奶生产线。听了一节 JAVA 视频,居然听到了这种认为 OOP 先进只支持 OOP 删除 GOTO 语句的程序设计语言,难怪它如此的低效低质。

12806 次点击
所在节点    编程
124 条回复
nbhec2
2016-12-22 14:12:44 +08:00
@popesaga 我电气工程及其自动化专业科班出身的,我们也叫软件工程,中控都是拿 C 写的现在也用 PHP , C 是什么我还是很清晰的, “著名科学家”的学生告诉我 C 也可以面向对象,劳您大驾请让我开开眼 C 语言是怎么面向对象的。
ikaros
2016-12-22 14:19:48 +08:00
Thoxvi
2016-12-22 14:22:27 +08:00
@nbhec2 换个角度说 jvm 就是 c 写的,那 Java 可以面相对象, Java 字节码在 jvm 中被解释
nbhec2
2016-12-22 14:35:53 +08:00
@Thoxvi 这么解释就有些强词夺理了,没有往顶层比的只有往底层比。照着么说 C 还能函数式再往上说还能面向并发云云种种。难道那往回说要说成开关柜也是面向 XX 的吗。机器只会逐条指令顺序执行, C 是一个经典的面向过程的开发语言这是基本常识吧。
svenFeng
2016-12-22 14:46:03 +08:00
楼上说 c 可以写面向对象是指可以通过结构体和指针函数等来实现和面向对象一样的实现,面向对象更多的是一种思想。再说到 goto , goto 用不好本来就会难以维护,就像指针,我一个 C++狗老喜欢用指针了,怎么爽怎么来,可是很多现代语言通过 gc 来自动管理指针比如 Python ,那也是一种进步,不是每个人都要熟悉计算机的每个底层结构来写代码,你不是计算机专业的,很多东西本来就存在观念差异,但是你思考一下就会发现,计算机的发展史往往都会往更高阶的抽象上走的
arakashic
2016-12-22 14:46:16 +08:00
@nbhec2 goto 也甩锅给 OOP 也是醉了。 oto 是一把双刃剑,从代码的可维护性角度来讲,的确不推荐(避免滥用)。不过工程实践里面, goto 用得还是很挺多的(遵守一定的规则的话)。至于有没有 goto 语句,只是一个语言设计上的选择而已,和 OOP 毛的关系?没有 goto 语句的语言多了去了, python 也没有啊, python 还没有 do-while 呢! C 也是可以写面向对象的,不仅有这方面的书籍, GObject 和 GTK 就是最典型的 C/OOP 。以后吐槽之前还是自己先搞搞清楚的好。
mimzy
2016-12-22 14:56:19 +08:00
「胡言乱语者」…尔曹身与名俱灭,不废江河万古流…
huiyadanli
2016-12-22 14:59:50 +08:00
我们懂你,而你不懂我们系列。。。
ipwx
2016-12-22 15:50:23 +08:00
非嵌入式领域,人工成本比硬件成本高得多。
northisland
2016-12-22 15:56:12 +08:00
上面说的很明白了,关键词是结构化编程,不推荐用 GOTO
SuperMild
2016-12-22 16:06:34 +08:00
你写是写得爽了,只管马上实现当前功能,但是维护呢,换个人来维护呢, OOP 是为了容易维护吧。 goto 也是,要改点什么东西, goto 是牵一发而动全身的,必须在脑里带着个警钟“改完了记得看看 goto 有没有影响”,累不累?
she3ehe
2016-12-22 16:12:31 +08:00
都支持异常了,要 goto 何用? 跟 oop 有啥关系
daysv
2016-12-22 16:14:41 +08:00
喜欢函数式
popesaga
2016-12-22 16:18:23 +08:00
真的是我们懂你,而你不懂我们系列啊~~~
nbhec2
2016-12-22 16:33:20 +08:00
@daysv 函数式是我的大爱,只是目前环境中用到的比较少。
nbhec2
2016-12-22 16:35:02 +08:00
@popesaga 准确的说是你以为你懂我们的设计模式,而我们却觉得你的设计模式很糟糕(以 JAVA 为代表)
cuebyte
2016-12-22 16:49:52 +08:00
@easing
@hyuwang
@svenFeng
@arakashic
@northisland
@SuperMild
@kkzxak47
@mimzy
大家不要跟楼主废话了,只是浪费自己时间而已。让这帖子沉了吧,免得浪费更多人时间。
时至今日居然还有人能为 goto 摇旗呐喊,我们只能默默说一句,“关我 P 事”了。
nbhec2
2016-12-22 17:07:57 +08:00
@cuebyte “时至今日居然还有人能为 goto 摇旗呐喊”只能代表你的无知,一你不知道他用到哪,第二你不会使用它。鸟哥也在为 GOTO 正名 http://weibo.com/ttarticle/p/show?id=2309403969652538662553#_0 ,著名编程语言 PHP 5.3 加入了 goto 年轻的 GOLANG 也设计了 GOTO 语句,都没你水平高。水平低就不要 AT 一圈人来显得自己好像不菜。
MartinLv
2016-12-22 17:39:29 +08:00
goto 当然有它的适用场景,但楼主用“允许从一个函数跳到另一个函数”作为挺 goto 的理由,不能认同。
无论什么领域,好的程序应该是模块化和正交化的的。模块可以是一个函数,也可以由很多数据结构和函数组成。模块应该尽量减少和其他模块的耦合和相互影响,只对外暴露必要的接口,一个模块内部的改动不应该影响其他模块的行为。
如果大量使用 goto 从一个函数跳到另一个函数,那修改一个函数而不影响其他函数的逻辑就很难做到,程序员必须知道有哪些函数可能会跳到这个函数内部,必须了解所有这些函数的逻辑才能维护这个函数。我不认为这是好的设计。
楼主说抽象化一个程序只是降低了记忆力门槛,没错,这正是抽象的好处,程序员只要保证当前模块遵守既定的接口,可以专注于当前模块的逻辑,而不用考虑对其他模块的影响,这样才能高效地维护程序。
当然,有的人天纵奇才,可以把整个程序的逻辑都装在脑子里,举重若轻,随处 goto 。但你让后来维护的人怎么接手呢?好的程序应该易读,易维护。不觉得 goto 用多了,尤其是跨函数的 goto 对程序可读性有什么好处。
panda1001
2016-12-22 17:40:44 +08:00
@cuebyte
谁说非要 if while , goto+malloc 就足够了,详见轮子哥的回答
https://www.zhihu.com/question/20125963

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/329320

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX