V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
deplives
V2EX  ›  程序员

javaer 是不是写啥都是一股 Java 味儿

  •  
  •   deplives · 32 天前 · 8045 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天 review 了一个 javaer 写的 Python 代码,真的是要吐了 一个 init 里面写了一百个参数,下面紧跟着一百个 self

    纯属被 java 的 get set 洗脑了

    第 1 条附言  ·  32 天前
    我的主要意思就是 javaer 写这种就是习惯了 getter setter
    我只是图里没截全,其实他下面还定义了一堆方法 set 方法用来给他们赋值,我看到这个代码真的无语了
    98 条回复    2025-03-15 19:52:15 +08:00
    nno
        1
    nno  
       32 天前   ❤️ 1
    纯粹就是水平问题,正常的 java 代码也不会一个构造函数塞 100 个参数啊
    InkStone
        2
    InkStone  
       32 天前   ❤️ 2
    虽然整体上我赞同标题,但你贴的这个一点都不 Java 。

    首先多参构造在 Java 里典型的做法是 Builder 模式,而不是全塞构造函数。其次就算是 Builder ,也没人会写 100 个参数的 Builder……肯定会拆成不同类型分级构造的。

    另外你这里完全没有 getter/setter 相关的内容。
    Valpha6
        3
    Valpha6  
       32 天前
    kotliner 表示 "?"
    yosoroAida
        4
    yosoroAida  
       32 天前   ❤️ 7
    100 多个参数。。。。这哥们不能多创建几个类分割下吗。。纯粹水平问题+1
    Goooooos
        5
    Goooooos  
       32 天前
    Javaer 不是一个空的构造方法,new 完后再 set 吗?
    谁会弄个 10 个以上的参数的构造方法?
    visper
        6
    visper  
       32 天前   ❤️ 2
    我觉得 java 味是 getter,setter, 各种 factory...
    wxw752
        7
    wxw752  
       32 天前
    现在 Java 都是用 lombok 注解,在编译的时候自动生成这些东西, 多少年前就不用手写了。
    wuyiccc
        8
    wuyiccc  
       32 天前
    看看你写的
    TimPeake
        9
    TimPeake  
       32 天前
    这一看就是是编程助手 tab 写的啊 你们还真以为是手写的 ? 0912 年了 不太相信有人这么蠢
    prosgtsr
        10
    prosgtsr  
       32 天前
    我们 javaer 要么就是 @Builder ,要么就是 new 然后 set 的。。
    jworg
        11
    jworg  
       32 天前
    我只知道用 @dataclass 注解,还有什么其他写法吗
    RandomJoke
        12
    RandomJoke  
       32 天前
    怎么感觉在黑 java
    wu00
        13
    wu00  
       32 天前
    一看就是 tab 写的
    dlmy
        14
    dlmy  
       32 天前   ❤️ 4
    这个跟 Java 味无关,纯粹是个人水平问题。

    真正的 Java 味是不管要做什么功能,先定义一堆对象,建几十个类再说,然后往里面套一堆设计模式,最后每个类就几十行代码,关键是自己还认为很优雅......
    bronyakaka
        15
    bronyakaka  
       32 天前
    java 不都传对象嘛?这和 java 没关系吧
    chihiro2014
        16
    chihiro2014  
       32 天前
    真要写这种不会用 lombok ,写个 NoArg 和 AllArg 的注解么?
    litchinn
        17
    litchinn  
       32 天前
    javaer 写啥都是 java 味儿这个没问题,但是截图这个不是 java 味儿,我体会到的 java 味是各种包装,各种抽象,各种继承
    javaer 切换到其他语言确实很难改变这些习惯,因为 java 纯面向对象,虽然后面有了 lambda 表达式,但是用起来和 rust 里的闭包 match 等功能不是一个级别
    jiangzm
        18
    jiangzm  
       32 天前
    @InkStone #2 Builder 模式也是屎一样的代码
    sagaxu
        19
    sagaxu  
       32 天前
    没见过这种 Java 代码,Java 味儿是搞一个 fluent builder

    Foo foo = Foo.fooBuilder()
    .setA("XXX")
    .setB("XXX")
    setC(1)
    .build()
    unco020511
        20
    unco020511  
       32 天前
    这种 java 得搞个 builder 或者叫 factory,反正怎么复杂怎么来
    w568w
        21
    w568w  
       32 天前   ❤️ 6
    歪个楼,我理解的 Java 味:

    - 所有东西建对象,还没开始写代码先在 model 目录下铺几十个 Java 文件

    - 所有对象不用 public 成员,全部重写 setter 、getter

    - 不管用什么语言,一定要用 Java 的命名风格(文件和类名一致,类名大写驼峰,变量名小写驼峰),即使这语言里的标准风格根本不是这样

    - 先抽象出 Beans 、Adapter 、Factory 、Manager 、Builder 、Delegate 、Runner 、Visitor… 即使是根本没有必要的小项目。然后把本来紧凑的几十行代码掰成几百行,再分散到二十个不同功能的文件里

    - 到处用框架提供的注解,但实际上又不懂 JSR 里的注解
    bxb100
        22
    bxb100  
       32 天前
    这和 java 有啥关系? 这不就抽象能力不足
    herm2s
        23
    herm2s  
       32 天前   ❤️ 16
    这也能打上靶啊,你去写 Java 不也是一股 py 味
    zdw189803631
        24
    zdw189803631  
       32 天前
    你这就是典型的以偏概全,就看到一个 javer 写的代码就 aoe 全部 javer 了?
    worldqiuzhi
        25
    worldqiuzhi  
       32 天前   ❤️ 1
    Java 没这么写的 看不少 Python 脚本都是这么写的
    leegradyllljjjj
        26
    leegradyllljjjj  
       32 天前
    重构!跑路!删库!
    deplives
        27
    deplives  
    OP
       32 天前   ❤️ 1
    @w568w
    实时上已经这么干了
    接手项目的第一天看完代码第一句话就是,这 Python 写的不行,没有层级结构,然后现在已经目录套目录了
    新功能的第一次提交就是建了一堆空 py 文件
    大小驼峰命名确定了
    一个处理上传文件的功能恨不得拆了十个方法,到处调来调去,其实这些方法未来也只用了一遍
    SmithJohn
        28
    SmithJohn  
       32 天前
    @deplives 提前留好接口,代码能解耦就解耦.不是挺好的吗.
    除非你提前跟他说了这就是一次性代码.
    ZeroDu
        29
    ZeroDu  
       32 天前
    以偏概全,别乱黑。网上对 java 的恶意真大。而且写 java 的也不会这么写
    deplives
        30
    deplives  
    OP
       32 天前
    @SmithJohn 这就是硬解耦啊,总共加起来功能代码连不超过 100 行,A 函数里面就只调用了一个 B 函数,再加一个打印日志,然后 B 函数里面只调用了一个 C 在加打印日志。
    这种解耦有意思么?
    SmithJohn
        31
    SmithJohn  
       32 天前
    @deplives 解了没有坏处,反而有留下扩展空间的好处,为什么不解?
    mb4555
        32
    mb4555  
       32 天前
    big class hhhhhhh
    wolfie
        33
    wolfie  
       32 天前
    乐,这就是吐槽不到点子上的结果。
    crysislinux
        34
    crysislinux  
       32 天前 via Android
    我 jser 写后端也一股 Java 味了。
    wolfie
        35
    wolfie  
       32 天前   ❤️ 4
    @jiangzm
    Builder 是附带上下文的设计模式,一些 Context 工具就是 Builder 的变种。
    看来 Java 全生态都是屎啊,那你能不能写一套生态替代 Java 呢。
    sthwrong
        36
    sthwrong  
       32 天前
    所以楼里出现了无码硬解。这么小规模的代码还怕没扩展空间?
    Loku
        37
    Loku  
       32 天前
    我这个 javaer ,将代码写成了 JavaScript
    javapythongo
        38
    javapythongo  
       32 天前
    这怎么看着像一个 dataclass 啊?我看开源项目中的 dataclass 也有几十个参数啊?只是用了 BaseModel 少了 init 方法而已
    FightPig
        39
    FightPig  
       32 天前
    看看腾讯的 ruby sdk, 那一眼看上去全是 java 味,而且有人提了几年了,他们也没改
    niubiman
        40
    niubiman  
       32 天前
    真正的 java 味是一股巨难闻的味道, 比如, 明明号称是面向对象, 但是 java 的对象只有方法, 没有属性, 要从对象上获取一个属性, 不好意思, 你要 getXXX(), 这才是 java 最难闻的
    cabing
        41
    cabing  
       32 天前
    java 也不会这么写啊。它这个类不够简单,权责不发。


    java 的 get 和 set 都有注解包好了。
    niubiman
        42
    niubiman  
       32 天前
    还有, java 的泛型居然他娘的是设计时的, 曾经调侃 java 和 javascript 的关系是雷锋与雷峰塔的关系, 现在大家可以大胆的说 java 和 javascript 的关系是 typescript 了
    kandaakihito
        43
    kandaakihito  
       32 天前
    你要喷也是喷 spring 仔,关人家正经的 Java 语言什么事情?
    kandaakihito
        44
    kandaakihito  
       32 天前
    算了,家访完楼主,释怀了。
    sir283
        45
    sir283  
       32 天前 via Android
    纯个人习惯罢了,op 以点盖全了。我也经常用 Java 那一套写 Python 、C/C++,可以看我的项目,跟语言没有关系,纯粹个人习惯。
    https://github.com/MrsEWE44/easyManager
    listen2wind
        46
    listen2wind  
       32 天前
    都是语言,搞什么歧视,能完成工作就行,你可以禁止别人在你负责项目写出带味的代码!
    me1onsoda
        47
    me1onsoda  
       32 天前
    @niubiman #40 可以把属性 public 啊,没人拦你。只是一些莫名其妙的人定了莫名其妙的规范
    Ghostisbored
        48
    Ghostisbored  
       32 天前   ❤️ 2
    每次看到这种标题都无语 来来来 要不让大家看看你的代码 show 一下
    3country
        49
    3country  
       32 天前
    ai 写的
    xFrye
        50
    xFrye  
       32 天前
    跟 java 有什么关系?这代码也不 java 啊
    fushall
        51
    fushall  
       32 天前
    哈哈哈哈哈哈哈 笑不活了
    zjsxwc
        52
    zjsxwc  
       32 天前
    所以为何不像 js 一样,如果变量名与对象的 field 一样,直接用语法糖解决

    比如 你图片里的写法可以写成:

    return {state, cuser, ctime, muser}
    poorcai
        53
    poorcai  
       32 天前
    虽然我不是 javaer ,但是想看看你们这种应该怎么写啊?纯求教。
    niubiman
        54
    niubiman  
       32 天前
    @me1onsoda 那你去看看几个 javaer 敢这么写代码, 大家都是 private, 这还不够味儿大么
    oamu
        55
    oamu  
       32 天前
    @niubiman #40 Java 太老了,一些老的规范难以去改动,说它没有“属性”其实不太对,大可以把字段设置成 public 取得相似的效果,但真这样做了,大概率会和整个生态冲突( Spring 、JPA 都深度依赖 getter/setter 反射)。#42 还是那句话:Java 太老了,泛型是后面打补丁加上去的。JVM 设计之时就不支持泛型,同时也为了兼容之前的代码,所以设计泛型时,采用了类型擦除的方案。
    曾经也是觉得 Java 一堆的糟粕,现在竟也觉得稳定能跑就行,缝缝补补又不是不能用,终究自己也是老了。
    lyxxxh2
        56
    lyxxxh2  
       32 天前
    @sagaxu
    我写 laravel 经常写这种流接口。
    框架自带的 orm + collection + 自定义模块,基本处处都有。
    不过 set 倒是不用,毕竟有__set 。
    InkStone
        57
    InkStone  
       32 天前   ❤️ 1
    @oamu public field 怎么会跟 property 一样呢? property 是 OOP 的,它可以在编程时像一个 field 一样被使用,但支持封装内部实现细节和多态。public field 既不能封装细节,也不能实现多态。

    Java 味最突出的地方就在这里:因为语言层对 OOP 的支持不好,所以必须搞一大堆开发约定,来在开发中模拟 OOP (此处的 OOP 还可以替换成 FP 以及其他各种范式——事实上 Java 对什么范式的支持都不好)
    AlexHsu
        58
    AlexHsu  
       32 天前
    java 早都培训完 lombol 了 这是典型的彩笔 pythoner 写的代码
    Meld
        59
    Meld  
       32 天前
    其实我觉得只有烂仔才会开群嘲,人家一喷你就会灰溜溜的解释:我不是针对所有 xxx 开发者,我只是针对 xxxx 行为的 xxxx 开发者,有这个闲工夫真不如写好自己的代码跳个大公司,在开 AOE 干啥。
    prosgtsr
        60
    prosgtsr  
       32 天前
    @deplives 我也爱拆方法,开发时会一个方法解决,调通之后就改成几个方法,你要问我为什么这么干,可能就是多年开发经验的直觉吧。。
    Meld
        61
    Meld  
       32 天前   ❤️ 1
    另外 java 现在也不写 get/set 啊,除非公司硬性规定不允许使用 lombok 时才会用 IDE 生成

    js 也会这么写吧:

    get name() { return this._name; }
    set name(value) { this._name = value; }

    C# 也见过类似的:

    public string Name {
    get { return _name; }
    set { _name = value; }
    }

    我理解这只是一种习惯或者开发思维,还是说因为 java 人多,再加上你只见过 javaer 写 get/set ,所以出来群嘲?
    kinkin666
        62
    kinkin666  
       32 天前
    这是 MFC 的味吧
    java 如果不弄 factory 和 builder 的话,都是 0 参构造函数,实例化完了再一个个 set 进去
    也有可能他就没想着让这个类直接给别人、别的地方实例化,故意不留 0 参构造函数
    niubiman
        63
    niubiman  
       32 天前
    @Meld #61 可以看看#57 的关于 oop 的说明, js 和 c#的这两种写法都是 oop 的, 完全满足 oop 的三大要素: 封装,继承,多态
    jqtmviyu
        64
    jqtmviyu  
       32 天前
    前端纯好奇请教:

    后端都是这种继承类的面向对象写法吗? 如果小项目还没到需要考虑拓展(实例小于 3), 写成面向过程会怎么样?

    go 的主流写法呢? 之前学语法的时候, 好像当成有类型的 js 思路写也没什么问题.
    niubiman
        65
    niubiman  
       32 天前
    @jqtmviyu 并不是后端都是 oop 的写法, 是 java 号称是 oop 的, 却很不 oop, 所以一股怪味, 其他能做后端的语言一大把, 有 oop 的, 也有 fp 的, 甚至还有混合范式的, 只跟语言有关, 跟前后端无关
    nullpointerskz
        66
    nullpointerskz  
       32 天前   ❤️ 1
    java 味的项目 20 年过去以后换一批人来照样可以维护,你是 python 味的? Python2 和 Python3 都不兼容? python 作者写的代码过几个月都看不懂是啥了?
    oamu
        67
    oamu  
       32 天前
    @InkStone #57 别偷换概念,我可没说 public field 跟 property 一样,说的是属性( attributes )。你对于面向对象的理解是什么呢?一定要支持 property ?不支持 property 的语言多了去了 C++、GO 、Rust 都不支持,难道它们对面向对象支持都不好?
    InkStone
        68
    InkStone  
       32 天前
    @oamu

    C++:对,不好。Java 不就是学的这一套么
    Go ,Rust:对,不好。Go 就不说了它缺的也不止这一个; Rust 这点没少被人吐槽,经常有人问“如何实现数据 mixin 而非只是接口 mixn”
    PhonRT
        69
    PhonRT  
       32 天前   ❤️ 5
    黑 javaer,V 站政治正确
    niubiman
        70
    niubiman  
       32 天前
    @oamu #67 你这个可以说是给自己举了大大的反例了, 首先 c++作为 oop 的编程语言没有 property 也是它的一大槽点之一, 而 go 和 rust 又从来不标榜自己是 oop 语言, 你用这三个语言举例不正好说明了 java 的 oop 标签不就是一坨吗
    oamu
        71
    oamu  
       32 天前
    @InkStone #68
    @niubiman #70 拿个语法糖还得意上了,懒得和你们吵。好好好,就你们家 Python 天下第一好行了吧。
    kristofer
        72
    kristofer  
       32 天前
    呃...以你贴的代码来说,这代码一点 Java 味都没有。还有就是你写过几种语言啊,还搞出语言歧视链了,一般不都是 Java 歧视 Python 吗
    Meld
        73
    Meld  
       32 天前
    @niubiman #63

    我理解你的说法,但是我觉得 OP 完全没有在攻击 java 本身特性的情况,他把 GET/SET 的写法等同于 java ,然后他完全不认可这种写法,再基于自己的认知在攻击 java 开发者,认为只有 java 开发者才会这么写。
    InkStone
        74
    InkStone  
       32 天前
    @oamu 有些语法糖,有就是比没有好,没有什么讨论余地。JVM 上的其它兼容语言,Scala 、Groovy 、Kotlin ,都支持 property 语法糖。其它新一点的主流面向对象语言也基本都支持,连 Java 自己都要搞 Beans 标准,搞 Lombok ,都不是没有原因的。

    Python 别的不敢说,在 OOP 这方面吊打 Java 肯定是没问题的——当然,因为能在 OOP 方面吊打 Java 的语言太多了,这倒也算不上什么优点。
    Meld
        75
    Meld  
       32 天前
    我是觉得 OP 因为见识(知识)相对匮乏,从正文看,OP 认为这种 Get/Set 的写法是 Java 独有的,基于这个前提再加上不认可 Get/Set 写法,来攻击 Javaer ,我是蛮费解的
    RuLaiFo
        76
    RuLaiFo  
       32 天前
    这一点都不 java ,纯粹是你同事代码习惯差,你也多学学 java 吧
    qiuhang
        77
    qiuhang  
       32 天前
    你说这种还好,就是参数多点,也没加什么参数校验什么的。多加点参数校验你就会发现跟很多开源框架一样的...... 真正的 java 味 python ,你应该看看阿里云的 python 版本 sdk
    lfitzgerald
        78
    lfitzgerald  
       32 天前   ❤️ 2
    是这个吗
    pvnk1u
        79
    pvnk1u  
       32 天前
    @qiuhang 毕竟阿里系铁杆 java 档,全是被 java 的裹脚布腌入味了的
    FrankAdler
        80
    FrankAdler  
       32 天前
    同事写的 go 也全是 java 味道,恶心的都不想碰那些代码
    muyiluop
        81
    muyiluop  
       32 天前
    哈哈哈,我也是写 Java 的😂
    skyyan
        82
    skyyan  
       32 天前
    @Goooooos 谁告诉你必须要 new 的啊
    Goooooos
        83
    Goooooos  
       32 天前
    @skyyan #82 我哪里说了必须啊?
    aboutier
        84
    aboutier  
       31 天前
    喷来喷去就那两个点。

    没什么新意, 和老太婆的裹脚布一样。
    to2false
        85
    to2false  
       31 天前
    ltaoo1o
        86
    ltaoo1o  
       31 天前
    @Meld #61 从没写过 java ,我 js 就是这么写 🤣

    ```js
    function Person(props) {
    let _name = props.name;
    return {
    get name() {
    return _name
    };
    }
    );
    ```
    Meld
        87
    Meld  
       31 天前
    @ltaoo1o

    是的,我理解 OP 还没说到很多人讨论的 OOP 特性,只是单纯喷 getset 的写法,反而暴露的认知问题
    msg7086
        88
    msg7086  
       31 天前
    这和 Javaer 啥关系啊,这就只是代码写得烂而已,这也能和 Java 扯上关系啊。
    silvernoo
        89
    silvernoo  
       31 天前
    @lfitzgerald #78 这味道才叫正
    FrankAdler
        90
    FrankAdler  
       31 天前 via Android
    @to2false 比这恶心吧 啥 dto vo provider builderr 链式 都搬过来了
    mmdsun
        91
    mmdsun  
       31 天前
    @oamu Java 的字段本身不支持多态,通过方法( getter 和 setter )实现多态行为 。这个才是根本原因。
    DeWjjj
        92
    DeWjjj  
       31 天前
    喜欢面对对象写法的人,确实是喜欢把任何东西都封装成件。
    我特别喜欢写管子,都是管子风格。
    3085570450tt
        93
    3085570450tt  
       31 天前
    @jworg 还有一个 attrs, 也支持注解写法; pydantic 好像也可以
    zhaokun
        94
    zhaokun  
       31 天前
    这不是 javaer ,别用你认为的这是 javaer 写的定义 javaer
    myk889090
        95
    myk889090  
       31 天前
    PHP 是世界上最好的语言
    mayli
        96
    mayli  
       31 天前
    其实差不多,如果真的有这个 100 多个参数的需求,除了__init__可以用 dataclass 省一些,构造的时候也还是得继续传 100 个进去。可能要是拆一下会好一点,但是业务就这么要求也没办法。

    getter setter 那个对于 py 真没必要。
    maix27
        97
    maix27  
       31 天前
    不是 javaer 写啥都 java 味,是只会 java 的人写这样的,多学几门语言呗,别做某一门语言的舔狗。
    jeesk
        98
    jeesk  
       30 天前
    提个问题:

    1. 如果你需要排查某个属性到底是在什么地方修改的? 直接使用属性访问,然后调用的地方有 10 处,你如何排查? 在每个调用的地方加 10 个断点,加 10 行打印日志? 如果你使用 set 方法,打一个断点就够了。



    2. 如果你要自定义处理某个字段的返回 value. 如果你是提供的框架第三方使用呢?

    要让开发者在所有调用的地方将属性访问,修改成调用方法? 难道将调用的 100 个字段都修改吗?如果用 getter() 只修改 getter 里面的内容就行了。


    3. 如果你不确定是否要限制某个设置值,然后在未来某个版本要限制了, 这个时候难道要废除属性访问?

    有些字段提供 getter,setter, 有些字段不提供 get/setter ? 开发者会不会骂娘?



    你就是一个菜鸡,代码为你自己写,没有考虑到各种兼容性,调试,和 review 等相关问题。和语言无关。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:23 · PVG 17:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.