xuanbg
V2EX  ›  编程

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

  •  
  •   xuanbg · Feb 15, 2023 · 4531 views
    This topic created in 1366 days ago, the information mentioned may be changed or developed.

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

    17 replies  •  2023-02-15 17:40:24 +08:00
    acctv2
    acctv2
    Feb 15, 2023 via Android
    1
    OP ?我猜应想说的是 PO ?

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

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

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

    楼主能不能给我举个不使用面向对象思想,但是封装 /继承的例子。
    wanguorui123
    wanguorui123
    Feb 15, 2023
    12
    面向对象的本质是尽可能的拆分和抽象具体的业务成为一个个及其原子化的封装,这样系统的灵活性可复用大大提高,正常来说拆分的越细越有利于后期的可维护性。
    xuanbg
    xuanbg
    OP
    Feb 15, 2023
    13
    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
    xuanbg
    OP
    Feb 15, 2023
    14
    @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
    xuanbg
    OP
    Feb 15, 2023
    15
    @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
    kop1989smurf
    Feb 15, 2023
    16
    看明白了,楼主的意思是,只要我不承认这是面向对象,就不是面向对象编程。

    "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
    AlexHsu
    Feb 15, 2023
    17
    面向对象就是编程语言层面的 code snippet 归根结底不还是为了让开发省事的 觉得不省事就用函数式编程呗 rust 那些新玩意 就不太过分强调 oo 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3011 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 05:29 · PVG 13:29 · LAX 21:29 · JFK 00:29
    ♥ Do have faith in what you're doing.