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

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

  •  
  •   xuanbg · 2023-02-15 06:54:42 +08:00 · 2807 次点击
    这是一个创建于 683 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2023-02-15 17:40:24 +08:00
    acctv2
        1
    acctv2  
       2023-02-15 07:17:58 +08:00 via Android
    OP ?我猜应想说的是 PO ?

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

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

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

    楼主能不能给我举个不使用面向对象思想,但是封装 /继承的例子。
    wanguorui123
        12
    wanguorui123  
       2023-02-15 10:45:59 +08:00
    面向对象的本质是尽可能的拆分和抽象具体的业务成为一个个及其原子化的封装,这样系统的灵活性可复用大大提高,正常来说拆分的越细越有利于后期的可维护性。
    xuanbg
        13
    xuanbg  
    OP
       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
        14
    xuanbg  
    OP
       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
        15
    xuanbg  
    OP
       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
        16
    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
        17
    AlexHsu  
       2023-02-15 17:40:24 +08:00
    面向对象就是编程语言层面的 code snippet 归根结底不还是为了让开发省事的 觉得不省事就用函数式编程呗 rust 那些新玩意 就不太过分强调 oo 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:04 · PVG 09:04 · LAX 17:04 · JFK 20:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.