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

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

  •  
  •   deplives · 7 天前 · 7622 次点击

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

    纯属被 java 的 get set 洗脑了

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

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

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

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

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

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

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

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

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

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


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

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

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

    Java 味最突出的地方就在这里:因为语言层对 OOP 的支持不好,所以必须搞一大堆开发约定,来在开发中模拟 OOP (此处的 OOP 还可以替换成 FP 以及其他各种范式——事实上 Java 对什么范式的支持都不好)
    AlexHsu
        58
    AlexHsu  
       7 天前
    java 早都培训完 lombol 了 这是典型的彩笔 pythoner 写的代码
    Meld
        59
    Meld  
       7 天前
    其实我觉得只有烂仔才会开群嘲,人家一喷你就会灰溜溜的解释:我不是针对所有 xxx 开发者,我只是针对 xxxx 行为的 xxxx 开发者,有这个闲工夫真不如写好自己的代码跳个大公司,在开 AOE 干啥。
    prosgtsr
        60
    prosgtsr  
       7 天前
    @deplives 我也爱拆方法,开发时会一个方法解决,调通之后就改成几个方法,你要问我为什么这么干,可能就是多年开发经验的直觉吧。。
    Meld
        61
    Meld  
       7 天前   ❤️ 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  
       7 天前
    这是 MFC 的味吧
    java 如果不弄 factory 和 builder 的话,都是 0 参构造函数,实例化完了再一个个 set 进去
    也有可能他就没想着让这个类直接给别人、别的地方实例化,故意不留 0 参构造函数
    niubiman
        63
    niubiman  
       7 天前
    @Meld #61 可以看看#57 的关于 oop 的说明, js 和 c#的这两种写法都是 oop 的, 完全满足 oop 的三大要素: 封装,继承,多态
    jqtmviyu
        64
    jqtmviyu  
       7 天前
    前端纯好奇请教:

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

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

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

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

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

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

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

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

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

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



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

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


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

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



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