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

我从来没见过比面向对象更糟糕的编程范式和语言

  •  1
     
  •   soclearn · 2023-02-14 12:31:17 +08:00 · 11216 次点击
    这是一个创建于 625 天前的主题,其中的信息可能已经有所发展或是发生改变。

    来看 java 的 hello world

    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello world");
        }
    }
    

    好一个蠢字了得。为了输出二个字,要写这么多样板和层次

    不能像 shell 一样平坦化吗

    而且以后,你还要学”继承,保护,ducking type ,mixed in, 参数类,原型链,面向 interface ,设计模式,并发加锁,信号量“ 而且到最后,你会被告知”py,cpp 的 oo 都是山寨,只有 smalltalk,ruby 那种 oo 才是纯的“

    并且最最后,你会发现先它们一步的函数式语言无须厚重的数据抽象,也能获得更好的代码结构和范式,并且天然并发,自带 dsl

    第 1 条附言  ·  2023-02-16 08:15:59 +08:00
    oo 的最大问题其实正是稍微一做大,其迅速呈现的反软件工程的属性
    一 W 个人对一份具体的 domainlogic 有一 W 种抽象方案。
    而且你不能把计算机的东西刻意往人的方面过高去抽象,否则属过度抽象

    企图靠语言和语法层面的统一,实现的工程化,其实是狭隘的。
    更好的语法糖和 dsl 。领域语义化,才是关键。
    (虽然语法糖的 dsl 化打破了语言语法层面的那种狭隘的工程化,但有待讨论)
    135 条回复    2023-04-27 03:43:28 +08:00
    1  2  
    zapper
        1
    zapper  
       2023-02-14 12:34:35 +08:00   ❤️ 53
    你说得对,给你 5 铜币
    Eiden
        2
    Eiden  
       2023-02-14 12:36:31 +08:00   ❤️ 2
    下面请双方辩手入场
    kop1989smurf
        3
    kop1989smurf  
       2023-02-14 12:37:00 +08:00   ❤️ 2
    每种设计都有其擅长的领域和既定的历史背景。

    你非拉着 2022 年的姚明跟 2004 年的刘翔比跨栏,结果姚明输了就是一文不值。
    soclearn
        4
    soclearn  
    OP
       2023-02-14 12:40:29 +08:00
    @kop1989smurf oo 绝对不是,oo 是一种滥用,oo 应该到面向 adt ,面向 class 就够了。然而,它却走向了“W 物 OO”的不归路
    ligiggy
        5
    ligiggy  
       2023-02-14 13:53:23 +08:00   ❤️ 2
    一个标题仿佛把世界上 90%的写程序的人都喷了,真有你的。
    oneisall8955
        6
    oneisall8955  
       2023-02-14 14:02:28 +08:00   ❤️ 1
    soclearn
        7
    soclearn  
    OP
       2023-02-14 14:04:00 +08:00
    @ligiggy oo 毒害了以 c ,cpp 为教科书成长起来的一代专业和非专业程序员。后来的语言都是简化或参照它们。oo 它在简化问题的时候,制造了更多复杂的东西。,它的被使用方式与设计方式是割裂的,中间损耗太大,放在谁身上都是。
    **对设计者是个挑战。甚至有人为了抽象而抽象,或过度抽象**
    **对复用者也是个挑战,加大了使用门槛**
    **对初学者更是致命的**
    BingoXuan
        8
    BingoXuan  
       2023-02-14 14:06:34 +08:00
    ?t=85
    Chaconne
        9
    Chaconne  
       2023-02-14 14:07:55 +08:00 via iPhone
    我技术小白,学啥语言好
    wangpugod2003
        10
    wangpugod2003  
       2023-02-14 14:08:48 +08:00   ❤️ 1
    有没可能是,真实的世界就是很复杂呢?
    有没可能是,真实场景的需求比 hello world 还是复杂多了呢?
    soclearn
        11
    soclearn  
    OP
       2023-02-14 14:11:34 +08:00
    最初的 oo 类似于 smalltalk 用于 gui 这样的场景和语言组合
    如果 oo 仅用于抽象数据而不是代码结构,那么足够。
    可是 oo 最后终于变成一种范式,W 物都 oo ,
    面向对象必然会导致数据抽象的不断堆叠,形成数据的巨集,最后接口是一个个数据“层次子世界”背后透出的东西
    容易让人数据接口和代码接口不分
    巨大的抽象数据。带来的问题不大
    巨大的抽象代码结构。光是这条设计,带来的问题就足够大

    从此,
    设计者,复用者,初学者,调试者,都要从分析那坨树形的层次开始。
    不复以前命令行中像修改命令式代码那样改动几个字,一行下去就能看到变化的快感了
    tyzandhr
        12
    tyzandhr  
       2023-02-14 14:11:42 +08:00 via Android   ❤️ 3
    写 fp ,你有这个本事吗?
    centralpark
        13
    centralpark  
       2023-02-14 14:12:20 +08:00   ❤️ 1
    首先,是 duck typing ,不是 ducking type……
    其次,你说的这些 Go/Rust 早就知道,所以直接把继承去掉了,再说这些,感觉好像穿越到了 2010 年代
    soclearn
        14
    soclearn  
    OP
       2023-02-14 14:12:41 +08:00
    @wangpugod2003 oo 绝不应该是对某种需求一比一的建模。没有哪种范式应该这么做。
    shinsekai
        15
    shinsekai  
       2023-02-14 14:13:54 +08:00
    我没有对象,所以我喜欢用 Matlab
    Seanfuck
        16
    Seanfuck  
       2023-02-14 14:15:14 +08:00
    不用 java 这种强制面向对象的语言就好了
    TWorldIsNButThis
        17
    TWorldIsNButThis  
       2023-02-14 14:18:06 +08:00
    duck type
    跟 oo 有什么关系

    semaphore 也 oo ? dijkstra:原来我还懂 oo 啊
    libook
        18
    libook  
       2023-02-14 14:22:41 +08:00
    Java 是 1995 年问世的,J2EE 是 1999 年问世的。在当时那个技术市场上,Java 的设计正好可以被用于解决很多企业的痛点。
    不过确实后面由 Java 刮起的 OO 风有点吹歪了,很多新手被教育为了 OO 而 OO ,任何问题都套框架和目录结构,全然忘记了它们只是个工具,有的场景可以极大提升开发维护效率,有的场景就很鸡肋。
    踩一捧一不可取,有人可以找出 100 个不适用 OO 的场景,也有人可以找出 100 个不适用函数式的场景。
    Bigglesworth
        19
    Bigglesworth  
       2023-02-14 14:24:06 +08:00
    让我想到一句话,oo 不绝对,就是绝对不 oo
    SuperManNoPain
        20
    SuperManNoPain  
       2023-02-14 14:27:52 +08:00
    对于我这种打工人来说能赚钱的就是好语言,不能赚钱还是拉倒吧
    SeaTac
        21
    SeaTac  
       2023-02-14 14:34:44 +08:00 via iPhone
    哈哈哈哈哈哈哈哈
    meeop
        22
    meeop  
       2023-02-14 14:39:52 +08:00
    哈哈哈😂
    soclearn
        23
    soclearn  
    OP
       2023-02-14 14:46:42 +08:00
    @TWorldIsNButThis 冯氏语言代码结构中的数据是都 mutable 的,带来并发问题。现在的语言基本逃不出这个范畴,只有纯粹函数语言不同
    soclearn
        24
    soclearn  
    OP
       2023-02-14 14:56:20 +08:00
    @tyzandhr 现在的语言实现有太多范式,比如 pipeline based,trigger based,data flow,组件式,为啥除了 oo 就是 fp ?

    现在的语言,运行时实现中除了 object based 就是 function based 这倒是真的。
    语言层可以有很多具体范式。
    soclearn
        25
    soclearn  
    OP
       2023-02-14 15:09:34 +08:00
    @libook 用函数式作为元可以写出上层 class 和 oo 的语言,如 scheme 。用对象式作为元能写出上层函数式语言,如 ruby
    现在的语言都是混合语言(实际上这里至少存在过程式,oo ,函数,混合)。
    Jwyt
        26
    Jwyt  
       2023-02-14 15:10:02 +08:00
    是的,你说得对
    parthenon2007
        27
    parthenon2007  
       2023-02-14 15:36:02 +08:00   ❤️ 1
    J2EE 才是业界毒瘤。
    LaTero
        28
    LaTero  
       2023-02-14 15:38:19 +08:00 via Android   ❤️ 3
    楼主真勇啊😄反正我是不敢在一般的论坛发这种的,大部分程序员都没有学过 oo 以外的模式,更体会不到 oo 的问题,所以自己唯一会的东西被“喷”就会感觉自己被否定。
    现在的新语言都在去 oo ,往过程式和函数式走,比如用 composition 代替继承,用 variant 来动态派发。我之前看到把 if 理解成多态,还有工厂模式之类的东西是真的给我整无语了,脱裤子放屁也没这样的。而且在游戏或者一些高内存吞吐量的场合 oo 的性能是真的差。
    est
        29
    est  
       2023-02-14 15:56:15 +08:00
    你这不是 oop 吧。。。是 Enterprise™ code

    我个人觉得面型对象都是跟游戏和 GUI 相关的事儿采用。
    dobelee
        30
    dobelee  
       2023-02-14 15:59:58 +08:00
    目前市场上大部分 lang 是半 oo 吧,主流的全 oo 就 java 和 c#,放弃即可。
    wetalk
        31
    wetalk  
       2023-02-14 16:05:03 +08:00
    习惯了 opp ,转而写函数式很痛苦
    krixaar
        32
    krixaar  
       2023-02-14 16:10:34 +08:00
    喷 OO 有点打击面太广,喷继承就行了。
    toneal
        33
    toneal  
       2023-02-14 16:12:26 +08:00 via Android   ❤️ 1
    独行侠请随意,代码量扩张到多人协作时,,,,
    eibici
        34
    eibici  
       2023-02-14 16:13:59 +08:00   ❤️ 1
    所以要用 c++,想面向啥面向啥
    wangpugod2003
        35
    wangpugod2003  
       2023-02-14 16:16:34 +08:00
    建议 LZ 学 C++,从过程到 oo 到函数式到 Template Metaprogramming ,完全满足你的要求~
    Martens
        36
    Martens  
       2023-02-14 16:16:42 +08:00 via iPhone
    6
    wangpugod2003
        37
    wangpugod2003  
       2023-02-14 16:20:14 +08:00   ❤️ 1
    你甚至用 C++能写出公司大神都没人能懂的 fancy code ,但是那怎么样呢?
    怎么找到如此多的 developer 和你一起搞?招聘?招不到人咋办
    0o0o0o0
        38
    0o0o0o0  
       2023-02-14 16:21:38 +08:00
    你可以使用 C#的顶层语句
    monologue520
        39
    monologue520  
       2023-02-14 16:25:00 +08:00
    我喜欢这种热闹的帖子,币已投
    RightHand
        40
    RightHand  
       2023-02-14 16:31:19 +08:00 via Android
    很好,那么:函数是对象么???
    lifeIsGame
        41
    lifeIsGame  
       2023-02-14 16:48:00 +08:00
    曾经我也思考过这个问题,为什么 java 没有像 python 一样设计, 兼容 函数式和 OOP 这两种方式。不得其解。

    刚才使用 Chatgpt 询问了下。以下为答案:

    Java 是一种面向对象的编程语言,它的设计目的是提供一种方便的、可靠的、可重复使用的方法来开发应用程序。Java 的设计者们考虑到了函数式编程的特性,但他们最终决定将其设计成面向对象的语言,因为他们认为面向对象编程更适合满足日益增长的复杂应用程序的需求。

    然而,随着函数式编程的发展,Java 也逐渐向函数式编程靠拢,特别是在 Java 8 版本中引入了一些函数式编程的特性,如 Lambda 表达式、Stream API 等。这些特性为 Java 程序员提供了更多的灵活性,并可以提高代码的可读性和可维护性。

    总的来说,Java 设计为面向对象语言是为了满足当时的需求,但随着时间的推移,它也逐渐向函数式编程靠拢,以更好地支持复杂应用程序的开发。
    libook
        42
    libook  
       2023-02-14 16:53:31 +08:00
    @minlearn #25 现在的语言其实都逐渐脱离学术性转而向功能性发展了,像是针对一些场景的痛点而专门推出的产品,致力于向提高协作效率、降低学习成本、降低心智负担、减少 bug 率等方向发展。所以不局限在一些理论体系之内。

    反正作为工程师,根据需求正确选型也是一个重要的能力。
    netabare
        43
    netabare  
       2023-02-14 16:54:55 +08:00 via Android   ❤️ 2
    面向对象只是一个范式而已。你用 Haskell 也能写出 OOP 的代码。而且近年来 OOP 不是也在转向组合优于继承和 declarative code 之类的比较良好的做法嘛。

    真要说糟糕的,大概还是那种「鸟是动物,所以会飞」之类的教学法和思维定势,但是 op 也提到了这本身并不是 OOP 的问题吧。OOP 也有不强调继承而强调消息传递的思路。

    然后就是 Java 或者上古 C#那套屎山堆叠,但是这玩意哪怕没 OOP 也有 Cobol 和 Fortran 珠玉在前。反过来说,如果没有 OOP 做铺垫,有多少人能有机会碰到 FP 的概念呢?

    我对 OOP 也有偏见,但是实话说很多东西并不是 OOP 的锅。
    DOLLOR
        44
    DOLLOR  
       2023-02-14 17:26:05 +08:00   ❤️ 3
    java 的问题在于把 oo 当成了唯一解,任何需求都试图拿 oo 实现。
    我见过有些 java 来的开发者去写其他编程语言的时候,明明一个 namespace+几个 function 就能解决的事情,他一定要写个 class 来包裹几个 method ,然后在每次调用的时候还得 new 一遍,再把参数喂给里面的 method 。
    darksword21
        45
    darksword21  
       2023-02-14 17:26:46 +08:00
    不觉得很酷吗?后面忘了
    playtomandjerry
        46
    playtomandjerry  
       2023-02-14 17:32:16 +08:00
    你的想法就跟 php 是世界上最好的语言一样。
    liprais
        47
    liprais  
       2023-02-14 17:32:43 +08:00
    见的太少了
    Dorian101
        48
    Dorian101  
       2023-02-14 17:33:53 +08:00   ❤️ 1
    C# 10 中的一个完整 C# 程序:
    Console.WriteLine("Hello World!");
    ttwxdly
        49
    ttwxdly  
       2023-02-14 17:42:07 +08:00
    php 是世界上最好的语言?
    urnoob
        50
    urnoob  
       2023-02-14 17:51:45 +08:00
    @LaTero 但凡计算机类毕业生 90%是 C 入门的不为过吧....开局就是非 oo 模式
    chenzhao0121
        51
    chenzhao0121  
       2023-02-14 17:52:59 +08:00 via iPhone
    你在 V2 这里喷 java ,不是捅了马蜂窝吗?这里用 java 的占 80%,等着找骂吧你。
    urnoob
        52
    urnoob  
       2023-02-14 17:55:23 +08:00
    继承,保护,ducking type ,mixed in, 参数类,原型链,面向 interface ,设计模式
    很多都只是概念 不用学,而且不是所有 OO 语言都要学这些吧 java 就没原型链这一说

    并发加锁,信号量 和 oo 有关?
    yannxia
        53
    yannxia  
       2023-02-14 18:06:31 +08:00
    Java 真不错···看起来还挺清爽的,真好理解呀
    tool2d
        54
    tool2d  
       2023-02-14 18:07:09 +08:00
    @minlearn "从此,设计者,复用者,初学者,调试者,都要从分析那坨树形的层次开始。"

    你提出了问题,但是没说怎么去解决问题?

    我想象不出来,没有 interface 怎么去实现一个完整的接口。不用继承怎么复用父类子类里,类似度很高的代码。

    函数编程就是一大堆函数,然而把一组函数封装起来后,那不就是一个对象嘛。
    dqzcwxb
        55
    dqzcwxb  
       2023-02-14 18:15:14 +08:00   ❤️ 1
    20 年前你说这个,那你很厉害
    2023 年你说这个,那你还是很厉害
    deorth
        56
    deorth  
       2023-02-14 18:16:08 +08:00 via Android
    Linus Torvalds 表示很赞
    adoal
        57
    adoal  
       2023-02-14 18:42:46 +08:00 via iPhone
    一个墙外的社区已经审查严重到连万物得万字都要打成 W 了吗?
    yummysakko
        58
    yummysakko  
       2023-02-14 19:53:47 +08:00
    感觉……没有我们 BASIC 的 GOTO 厉害
    levelworm
        59
    levelworm  
       2023-02-14 19:59:25 +08:00 via Android
    火前留名
    levelworm
        60
    levelworm  
       2023-02-14 20:00:09 +08:00 via Android
    @doublezhang #58
    你就当汇编语言写就行了,还有 POKE 和 PEEK 呢。
    balsam
        61
    balsam  
       2023-02-14 20:04:10 +08:00 via Android
    不想写可以不写,写美国人的 c++去。
    GeruzoniAnsasu
        62
    GeruzoniAnsasu  
       2023-02-14 20:10:31 +08:00
    喷得好,但是内容和标题有一丢丢偏差,我来帮 OP 重新拟个符合他想表达的内容的标题:


    > 我从来没见过比 [JAVA 这种只能面向对象还要试图解决一切问题的东西] 更糟糕的编程范式和语言



    深表赞同啊,滑稽
    netabare
        63
    netabare  
       2023-02-14 20:16:47 +08:00 via Android   ❤️ 2
    没有 interface 还有 trait ,还有 typeclass ,当然这两个和 interface 经常混在一起。只讨论使用的话,作用也很相似,提取出公共接口提供代码复用而已。

    表达子类型关系,除了继承完全也可以用别的方式来做,比如说组合或者混入,比如说把方法的实现写进 interface 让具体类型提供最小的需要实现的条件,比起直球继承,这种写法最大的好处大概就是松耦合和类型安全了。

    把函数编程理解为一堆函数然后封装起来,感觉是既不懂 FP 大概也不懂 OOP 的发言。
    xtinput
        64
    xtinput  
       2023-02-14 20:19:46 +08:00
    所以你去设计一种新语言吧
    WispZhan
        65
    WispZhan  
       2023-02-14 20:24:40 +08:00 via Android
    @deorth kernel 里难道不是没有 oo ,却是满地 oo ?
    ksc010
        66
    ksc010  
       2023-02-14 20:37:07 +08:00
    这个标题让我想到了王垠
    xtinput
        67
    xtinput  
       2023-02-14 20:39:37 +08:00
    shell 输出 hello world 很简单,那么你用 shell 写一个接口给客户端调用试试?用 shell 写一个界面试试
    snw
        68
    snw  
       2023-02-14 21:15:19 +08:00 via Android
    视要解决的问题不同,需要不同的工具而已。
    小需求用脚本容易解决,复杂不统一的需求还是老老实实面向对象比较好。
    dingwen07
        69
    dingwen07  
       2023-02-14 22:09:51 +08:00 via iPhone
    你可以继续在函数式编程里递归,然后栈溢出

    仔细看了一下你的回复,OP 你是不是对 fp 有什么误解?什么时候 Ruby 成了 fp 了?
    546L5LiK6ZOt
        70
    546L5LiK6ZOt  
       2023-02-14 22:14:46 +08:00   ❤️ 3
    不知道楼主有没有了解过 oop 的历史。oop 的概念被提出来,最初的本意不是面向对象,而是面向消息,名字起得不好,容易造成误会。加上后来 gui 编程开始流行,大家发现界面上的的组件可以用 oop 的对象表示,组件之间也存在继承关系。当时流行的 c++ 和 java 都支持 gui 编程,自然也就慢慢引领 oop 往继承方向发展了。每个语言都有一定的技术债,了解下历史,自然也就明白为啥现在会是这样子,没有完美的。可以看下 [维基百科]( https://en.wikipedia.org/wiki/Object-oriented_programming) 和 [The Forgotten History of OOP]( https://medium.com/javascript-scene/the-forgotten-history-of-oop-88d71b9b2d9f)。

    话说天然支持并发的应该都是纯函数式编程语言吧。纯函数式编程语言有个问题,就是有状态的数据结构没办法用语言本身来实现,例如哈希表( haskell 貌似是底层虚拟机提供实现的)。这意味着不少依赖状态的数据结构和算法都得改,用函数式的思维模式重新思考。

    而且貌似在软件工程领域,很少有用函数式思维来建模的方法论。例如用 oop 建模,有 uml ,通过画类图、时序图等等来分析复杂业务逻辑,这些图都是可以方便映射到代码实现当中的。但是在函数式编程领域,面对复杂的业务逻辑时应该怎么建模呢(怎么通过图形化方式表示高阶函数、functor 、monoid 、monad 等概念)?
    aliveyang
        71
    aliveyang  
       2023-02-14 22:20:31 +08:00
    什么好用就用什么呗,我没有信仰
    skies457
        72
    skies457  
       2023-02-14 22:25:51 +08:00
    oo 方便堆屎山
    meteor957
        73
    meteor957  
       2023-02-14 22:27:31 +08:00
    @chenzhao0121 不是 v2 ,java 程序员是中国程序员里面占比最多的,曾经 java 近似于程序员的代名词。
    noparking188
        74
    noparking188  
       2023-02-14 22:32:35 +08:00
    我用库多的,都可以
    boqiqita
        75
    boqiqita  
       2023-02-14 22:40:51 +08:00
    2023 年了,还用中文,跟我一样蠢。
    amlee
        76
    amlee  
       2023-02-14 22:45:40 +08:00
    @546L5LiK6ZOt 并不需要用图形化的方式表示你说的那些概念。

    换句话说,你当初学习数学的时候,用图形去理解交换律或者结合律了吗?

    我的理解是,对于函数式范式,写代码的时候就同时在建模。因为往深了走,抽象程度就越来越高,函数式就越来越声明式,直到最后函数式变成声明式的子集。
    lixintcwdsg
        77
    lixintcwdsg  
       2023-02-14 22:46:37 +08:00
    作为有代码洁癖的中老年开发工程师真心有点儿看不下去。
    这种天天讨论语言的行为和玩儿摄影天天研究这个头更锐那个头控制畸变更好有什么区别,拍出来的照片一般都是入门级别。
    螺丝刀木头柄的还是塑料柄的影响你拧螺丝吗?
    有这精力把各种系统设计了解齐全一点儿,aws 阿里云上那么多公共服务,你翻翻文档能都熟悉了都比纠结这个事情强。
    lixintcwdsg
        78
    lixintcwdsg  
       2023-02-14 22:49:16 +08:00
    真的对工程化有兴趣,如何接近最佳实践去控制工程质量,语法不能说没用,但是最重要最难的是如何让研发组织使用相同的习惯来开发。
    都用一坨屎标记,也比你用香奈儿五号我用六神花露水他用风油精强。
    kaiki
        79
    kaiki  
       2023-02-14 22:51:24 +08:00
    来写 PHP 吧,PHP 是世上最好的语言,退一步来讲 JS 好像也可以
    webcape233
        80
    webcape233  
       2023-02-14 23:03:00 +08:00 via iPhone
    你说的好,但是我不敢这样发言,怕被喷,默默点赞
    leimao
        81
    leimao  
       2023-02-14 23:09:41 +08:00 via iPhone
    我觉得能讨论编程语言的都是大佬
    soclearn
        82
    soclearn  
    OP
       2023-02-14 23:22:48 +08:00
    @546L5LiK6ZOt 本来不想再继续说了。但有些人受 oo 荼毒至深。

    工程化的极致就是 uml 建模吗,这不正是 oo 导致的恶果和习惯思维吗?
    把代码和数据当成一团,为其分层级和建立图联接。正是 oo evil 的开始。

    库的设计者:
    可以使用纯函语言,可以作为元语言,在这上面建立 class language ,可以 src to src 转译到纯函语言。避免直接在 class language 和 oop 层次建立一切。
    但用户编程级:
    必须严格控制到止仅作为数据抽象。不要现代 oop 三重机制后面的东西。
    这样才可以避免巨大的复用结构作为代码,带来的巨大的成本。包括 uml 。
    546L5LiK6ZOt
        83
    546L5LiK6ZOt  
       2023-02-14 23:24:24 +08:00
    @amlee 你这样子太理想化了。现实中面对复杂的业务需求,很难一下子全部理清并动手写代码的。还是需要画一些图来跟产品、测试、其他开发人员沟通,对齐需求和技术方案。如果一开始就写代码,你确定大家都能快速看懂代码吗?但是流程图、时序图这种,大家都能容易理解。例如同时把代码和相关的流程图同时摆在你面前,你会选择先看代码还是先看图?
    soclearn
        84
    soclearn  
    OP
       2023-02-14 23:29:03 +08:00
    相信任何人都承认,用 oo ,
    动不动要翻文档查一下,啥东西都藏在很深的层次下。
    数据还分模板,动手就要 new 一大通。代码还要刻意多态
    这是一眼看上去多么痛苦的事。
    soclearn
        85
    soclearn  
    OP
       2023-02-14 23:31:20 +08:00
    更别说 oop 后面的那些事了,为了解决 oop 的不足,不断继续 oop ,最后发现 oop 了一大堆要学的东西。
    soclearn
        86
    soclearn  
    OP
       2023-02-14 23:33:32 +08:00   ❤️ 2
    好多人在一件事的东西,学不会就事论事,扯一大堆。还整一堆反问总结以增加气势。
    就是不会抓住中心问题。看得着急。
    546L5LiK6ZOt
        87
    546L5LiK6ZOt  
       2023-02-14 23:36:58 +08:00
    @minlearn
    并不是说一定要 uml 建模,我想表达的是必须要有一种业务建模的方式,在问题域和解空间之间建立一个桥梁,要有个过渡。你说的建立 class language 就是指 dsl 吧(不知有没有理解错)?在接到需求就能马上动手建立 dsl 吗?不需要建模分析吗?不需要的话,说明需求还是太简单了。
    soclearn
        88
    soclearn  
    OP
       2023-02-14 23:39:20 +08:00
    oo 并不是大型复用的绝佳良方。只要代码本身没被抽象掉,企图用抽象数据的方式不断叠加,来代替一切编程动作和面向所有人。只能是自欺欺人,说到底,它只完成了数据层面的工作。而且这个抽象数据的方式也越来越复杂。

    而良好简单的代码,除了数据,才是所有人用这语言第一时间要接确到的。
    soclearn
        89
    soclearn  
    OP
       2023-02-14 23:42:30 +08:00
    否则。为啥面向接口和 dp 不在基础的 oop 层面就完成。因为 oop 不直接包含对抽象代码的支持。它只能靠 oo idioms ,oo 习惯用法,这些约定的东西才能继续。

    基于数据抽象的工作。只能是无底洞。
    Leviathann
        90
    Leviathann  
       2023-02-14 23:55:06 +08:00
    讲的很好
    你打算花多少时间给团队普及 monad monoid semigroup functor applicative
    546L5LiK6ZOt
        91
    546L5LiK6ZOt  
       2023-02-15 00:04:37 +08:00
    以我的实际经历来看,在面对复杂的业务需求,往往产品经理单方面都是很难理清需求的,是需要多方(包括业务、测试、开发)一起来讨论分析。这时一般都是用 uml 来沟通(不一定是标准的 uml ,大家看得像就行),uml 大家都容易理解。如果直接用 dsl 来跟各方人员沟通,我觉得是不可能的。
    gg2018
        92
    gg2018  
       2023-02-15 01:05:45 +08:00
    op 你可看过 易语言 代码了? 那才是恶心啊!

    以前用 java 、php ,后来学 go 那段时间 的确难以忍受 go 的风格,但是后来就好了,每种语言有他的魅力,适应就好

    如果 能力强,可以改造个新的语言,但是你又会发现 还是需要很多 比如 public func package 之类概念进来,不然没办法做抽象化, 个人见解
    gdgoldlion
        93
    gdgoldlion  
       2023-02-15 08:38:43 +08:00
    面向对象编程刚兴起时,很多人都觉得是银弹
    但实际使用时,出现了不少问题,后来兴起了设计模式,敏捷开发等等也是为了解决这些
    Java 中最明显失败的例子就是 swing ,这是 analysis paralysis 的经典例子,面向对象的经典反面教材,他的很多设计都可以说符合面向对象的典范,但实际用起来就是不好用,越用越头疼
    几十年的编程实践证明了,面向对象不是银弹……
    最后,面向对象并不是一无是处,对于游戏开发或者 UI 来说,他用来设计一些东西比较直观易懂。但是哪怕游戏这种大量使用渲染和可视化技术的软件,面向对象也不适合用来构建基础架构,大家都用组件了
    ScotGu
        94
    ScotGu  
       2023-02-15 08:39:41 +08:00
    你们不要在打了了啦!
    tairan2006
        95
    tairan2006  
       2023-02-15 08:47:12 +08:00
    谈不上最差,因为有的语言更差,比如 vb ,或者 bash ?

    不过新语言对 OO 的支持都弱化了,go/rust 之类的。当然在某些领域做 OO 设计还是很有必要的。
    ShotaconXD
        96
    ShotaconXD  
       2023-02-15 09:01:40 +08:00   ❤️ 1
    不是很理解踩在凳子上嘲讽老头矮的行为.
    LXGMAX
        97
    LXGMAX  
       2023-02-15 09:19:01 +08:00
    双方辩手精彩的讨论
    cheng6563
        98
    cheng6563  
       2023-02-15 09:19:37 +08:00
    basic 最垃圾,每行都要写行号,加一行代码要把整个文件每一行都改一遍,我用易语言笑而不语。
    daozun
        99
    daozun  
       2023-02-15 09:23:16 +08:00
    经典论战它来了,板凳瓜子准备好
    tool2d
        100
    tool2d  
       2023-02-15 09:28:26 +08:00
    @netabare "把函数编程理解为一堆函数然后封装起来,感觉是既不懂 FP 大概也不懂 OOP 的发言。"

    函数式编程也是写函数啊,只不过传统封装是维护内部状态,而函数式编程是维护外部状态。

    这一堆函数,在 JAVA 语言里面就是放进一个文件里的,而文件不就是一个 class 对象嘛。

    其他语言还有各种命名空间,java 就是一切皆对象,当时就是这样设计的。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1106 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:51 · PVG 06:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.