看到有人喷 Java ,喷 OO,我想说

2023-02-15 06:54:42 +08:00
 xuanbg

这个世界上,根本没几个人用 Java 写 OO 代码,基本上都是 OP 。包括我,凡是用 Sping 那一套的,写出来的代码十有八九和 OO 屁关系都没有。

2701 次点击
所在节点    编程
17 条回复
acctv2
2023-02-15 07:17:58 +08:00
OP ?我猜应想说的是 PO ?

我一直很疑惑 OOP 的本质是什么,OP 能讲讲什么代码算 OOP 吗
gouflv
2023-02-15 08:44:24 +08:00
所以下一个问题是:
为什么用了 spring ,代码就 PO 了?
zhangchongjie
2023-02-15 08:58:31 +08:00
哈哈,围观吃瓜
wangpugod2003
2023-02-15 09:01:33 +08:00
这不正是 spring 的成功么?免得你们觉得 OO 垃圾不好用,像堆积木一样简单让你爽。
xuanbg
2023-02-15 09:09:07 +08:00
@acctv2 首先,什么是面向对象的本质?我认为面向对象的本质绝对不是什么“封装、继承、多态”这些。“封装”是广泛存在的,不是面向对象专有的特性。“继承”也并非面向对象语言的特色。“多态”就是一个从继承衍生出来的一个特性,但这个特性并没有什么了不得的大作用。
那么,面向对象的本质到底是什么?我认为面向对象的本质是:将方法和与其相关的数据,封装在一个对象里面,实现了“高内聚、低耦合”的目的。这样,数据和功能就成了一个统一的、内聚的、不可分割的原子。当一个系统由这样的一个个原子构成的时候,非但在程序的设计上,能够实现高度封装。也因为数据和功能的统一,他们也就有着相同的生命周期。这对于运行时的内存管理而言,也是具有非常大的优势的。这才是面向对象的真正先进的地方。
那么,为什么我们写代码,哪怕是用 Java 这种面向对象的编程语言,写出来的代码还是面向过程的呢?其实,原因就在于我们的直觉就是 I/O 模型。使用一个程序,就像使用计算器,输入数值和操作符,就能给出结果。既然是这么使用的,那么自然也就这么去实现了。而且,任何一个方法,不都是这样的吗?调用的时候要给入参,方法返回结果。这逻辑,难道不是面向过程的逻辑吗?所以,只要不是刻意去设计,任何人编程都会用面向过程的思维去写代码。

最后,什么样的代码是面向过程的代码? C 这种不面向对象的语言自然不用说。如 C 艹、Java 这种面向对象的编程语言,如果数据和功能分离,也就是数据通过贫血实体类承载或包装的话,就是面向过程的思维方式的最直观体现了。
canacan
2023-02-15 09:44:14 +08:00
可是这种充血模型,本质上不就是封装吗。
Leviathann
2023-02-15 09:53:32 +08:00
是这样的
99%的 bean 都没有状态,跟 oop 其实根本不沾边
xuanbg
2023-02-15 09:53:39 +08:00
@canacan 就是封装啊,把数据和功能逻辑封装在一个类里面。这个世界到处都是封装,质子、中子、电子封装成一个原子。。。封装可以算是我们这个可观测宇宙的基本规则了,把一些相关功能封装成一个类,有什么好稀奇的。但是,把相关数据也封装进这个类,才是面向对象编程语言的创新。
2bad4u
2023-02-15 09:54:58 +08:00
写代码就讲 oo ,写 mybatis 查询话句就说好管理。

算球,没一个人敢承认:没有 spring boot 之前用 java 开发多难受。
rocliu2020
2023-02-15 10:24:06 +08:00
楼主几年 Java ?
kop1989smurf
2023-02-15 10:31:20 +08:00
““封装”是广泛存在的,不是面向对象专有的特性。“继承”也并非面向对象语言的特色。“多态”就是一个从继承衍生出来的一个特性,但这个特性并没有什么了不得的大作用。”

楼主能不能给我举个不使用面向对象思想,但是封装 /继承的例子。
wanguorui123
2023-02-15 10:45:59 +08:00
面向对象的本质是尽可能的拆分和抽象具体的业务成为一个个及其原子化的封装,这样系统的灵活性可复用大大提高,正常来说拆分的越细越有利于后期的可维护性。
xuanbg
2023-02-15 10:46:22 +08:00
public class A {
protected void print(String log) {
System.out.println(log);
}
}

public class B extends A {
public void action(int type) {
switch (type) {
case 1 -> run();
default -> walk();
}
}

private void run() {
super.print("run");
}

private void walk() {
super.print("walk");
}
}
xuanbg
2023-02-15 10:48:16 +08:00
@kop1989smurf public class A {
protected void print(String log) {
System.out.println(log);
}
}

public class B extends A {
public void action(int type) {
switch (type) {
case 1 -> run();
default -> walk();
}
}

private void run() {
super.print("run");
}

private void walk() {
super.print("walk");
}
}
你看这段代码,用了继承了吧,把动作封装在 B 里面了吧?面向对象了吗?
xuanbg
2023-02-15 10:57:12 +08:00
@kop1989smurf 还不明白的话,我再加个 C 。
public class C extends A{
public void action(int type) {
switch (type) {
case 1 -> sing();
default -> speak();
}
}

private void sing(){
super.print("sing");
}

private void speak(){
super.print("speak");
}
}
kop1989smurf
2023-02-15 11:11:45 +08:00
看明白了,楼主的意思是,只要我不承认这是面向对象,就不是面向对象编程。

"Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code. The data is in the form of fields (often known as attributes or properties), and the code is in the form of procedures (often known as methods)." --维基百科
AlexHsu
2023-02-15 17:40:24 +08:00
面向对象就是编程语言层面的 code snippet 归根结底不还是为了让开发省事的 觉得不省事就用函数式编程呗 rust 那些新玩意 就不太过分强调 oo 了

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

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

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

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

© 2021 V2EX