V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nbhec2
V2EX  ›  编程

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

  •  
  •   nbhec2 · 2016-12-22 09:52:55 +08:00 · 13162 次点击
    这是一个创建于 2900 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    124 条回复    2017-01-20 17:25:10 +08:00
    1  2  
    tscat
        101
    tscat  
       2016-12-23 08:21:27 +08:00 via iPhone
    面向对象是一种编程思想, goto 是一条语句。
    如果你喜欢,我可以用一堆 goto 完成一个面向对象的开发。请问, 他的效率是高或者低?
    顺便告诉你, c 真的可以进行面向对象开发。。
    terence4444
        102
    terence4444  
       2016-12-23 08:32:30 +08:00 via iPhone
    简直是吃饱了没事干, JAVA 基本用于复杂的开发但实时性要求不高, OOP 好处就是便于维护。一个大型项目不 OO 的话,维护成本太高了。

    在工控,单片机领域,一些场景对处理速度要求很高。有时候片段处理需要保证毫秒级不然下一个信号来了上个还没处理完就要出问题。这种情况下用 GOTO 提升性能也是正常的。但这样的代码规模不大,也不需要一定要 OOP 。

    所以楼主是在没事找事,而且措辞难堪,回复完这条就 block 了。
    000wangxinyu000
        103
    000wangxinyu000  
       2016-12-23 09:07:01 +08:00
    @nbhec2 Me against the world...
    nbhec2
        104
    nbhec2  
    OP
       2016-12-23 09:07:33 +08:00 via Android
    @cuebyte 孩子,我见过很多低智商的培训生来面试,和你的语风很像,这叫物以类聚人以群聚。我们不仅没丢饭碗而且还维护住了强大的市场这就是我们牛逼。有一句话你没说错,就是我们的工作不仅你这样自己都知道自己低能的人做不了而且就算把代码给你你也翻不了。市场还是我的,
    mhycy
        105
    mhycy  
       2016-12-23 09:14:32 +08:00
    @nbhec2
    看懂 OOP 概念以后你会想删帖的,我在 10 年前有和你一样的想法。
    建议再买一本<深入浅出设计模式>看看
    cuebyte
        106
    cuebyte  
       2016-12-23 09:43:15 +08:00
    @nbhec2 你看你都被喷成狗了,别死撑了,回去继续写你的 bug 吧
    wohenyingyu02
        107
    wohenyingyu02  
       2016-12-23 09:45:38 +08:00
    第一次听说面向对象可以降低入门难度的。。。楼主神童
    hosiet
        108
    hosiet  
       2016-12-23 10:17:35 +08:00 via Android
    自动化科班出身也学了不少 CS 的人过来说几句:首先任何流行的东西都有其存在意义,这样就不能否认 OOP 的价值。然后工业控制和现在流行的 IT 领域确实不一样,人力成本与运行成本比例很不同,这决定了在传统控制领域宁愿多投入人力改进代码也不会选用快速开发但运行效率可能不够好的设计方式,对新技术的采纳也更加缓慢。

    总之又是一个隔行如隔山的范例。
    shyling
        109
    shyling  
       2016-12-23 10:56:42 +08:00
    性能优化难道不该减少分支? goto 什么?
    junzki
        110
    junzki  
       2016-12-23 14:19:35 +08:00
    GOTO 也不是不能用, C 语言标准库中就有使用 GOTO 的地方。
    不建议使用 GOTO 是因为有些人会滥用它,导致程序变得更加难以维护。
    nbhec2
        111
    nbhec2  
    OP
       2016-12-23 15:17:09 +08:00 via Android
    @shyling 用 GOTO 跳过不需要执行的行或直接跳进另一个函数的某一行执行一部分执行。
    shyling
        112
    shyling  
       2016-12-23 15:26:17 +08:00
    @nbhec2 为什么要 goto
    nbhec2
        113
    nbhec2  
    OP
       2016-12-23 17:41:21 +08:00 via Android
    @shyling GOTO 是需要一行语句即可以飞跃到任意一行 IF ELSE WHILE 等语句可能要执行许多行
    u13498
        114
    u13498  
       2016-12-23 17:45:39 +08:00
    @nbhec2 不执行某段函数或者跳到另一个执行为什么不最小单元化函数,然后通过 return 和调用函数也能很好的实现啊,而且结构更加清晰,不是吗?当然,你说你用 goto 可以一个函数几百行代码跳来跳去我没话说,你让一个没看过这个代码的人来维护,你觉得结果会怎么样呢?然后,楼上也并没有说不允许使用 goto ,只是建议少用,如果业务需求非用不可(其实大部分人用 goto 就是偷懒,不想写那么多判断条件或者循环直接 goto 了,当然,有的复杂的逻辑使用条件或者循环会造成大量的冗余代码或者运行效率低下,比如底层驱动,这另说),那没人有意见。然后 goto 为什么要和 java 比,和 OOP 比呢?
    u13498
        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 你说你可以记住你写的所有代码,记不住自己写的所有代码就是辣鸡,那你知道敏捷开发吗?知道什么叫需求变更吗?
    u13498
        116
    u13498  
       2016-12-23 17:49:06 +08:00
    @nbhec2 你用 goto 之前不用判断?不判断的话一句调用也能解决啊,要跳出一个 break ,一个 return 不就解决了?
    u13498
        117
    u13498  
       2016-12-23 18:01:34 +08:00
    nbhec2
        118
    nbhec2  
    OP
       2016-12-23 18:35:27 +08:00 via Android
    @u13498 我们是做中控的,还真是写驱动级程序的。另外我们需要经常回跳。几百行到是少见,但是几十到二百多行到是比较常见的。另外除了中控写嵌入式下位机时往往只能使用 GOTO(JMP/SETJMP)。我是在对 JAVA 的设计表示非常不认可并齐之改用 GOLANG 的总结
    cuebyte
        119
    cuebyte  
       2016-12-24 09:02:11 +08:00
    @u13498 跟傻逼废什么话
    ghos
        120
    ghos  
       2016-12-24 12:53:43 +08:00
    然而各种语言有各种语言的使用场景,GOTO 在某些场景是很有必要的对于另一些场景又显得没有那么必要 抛开使用场景来评价一个语言设计是不合理的。
    v2exhehehehe
        121
    v2exhehehehe  
       2016-12-26 14:25:23 +08:00
    首先 c 是可以面向对象的,有兴趣可以看看 jserv 的 物件导向的 C ,在 Linux kernel 里面也有大量的范例。
    一般 goto 用于基于返回值的错误处理(比如做一些清理)以及跳出深层的嵌套
    ryd994
        122
    ryd994  
       2016-12-26 15:45:38 +08:00 via Android
    goto 在标准库和 Linux 内核里都不少见
    主要用于 bailout cleanup
    通常的准则是只用于这类用途
    不控制运行逻辑,也不连续使用(每个逻辑分支最多一个,到函数尾)
    另外,编程没有银弹。 oo 是很好用的设计,但并不是万能。工程师是以目标为导向,根据现有的条件,选择最优化的途径。
    Balthild
        123
    Balthild  
       2016-12-28 12:48:05 +08:00 via Android
    @nbhec2 git 就是用 C 语言实现面向对象的例子之一。
    另外,早期 C++编译器只是 C++到 C 的翻译器,这个你该不会不清楚吧?
    wysnylc
        124
    wysnylc  
       2017-01-20 17:25:10 +08:00
    特意来上来骂你一句,沙比.
    面向对象降低门槛真是第一次听说,这个真理你可以申请雨果奖.
    低能的大脑无法装载程序?请问你的大脑能背多少字节的数据?怕是你的猪脑 1000 个 01 都背不下来.
    趁早退出软件行业,至少别进入 java,有你这种智障在技术只会倒退不会进步.
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.