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

2023-02-14 12:31:17 +08:00
 soclearn

来看 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

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

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

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

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

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

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

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

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

其他语言还有各种命名空间,java 就是一切皆对象,当时就是这样设计的。

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

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

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

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

© 2021 V2EX