
今天 review 了一个 javaer 写的 Python 代码,真的是要吐了
一个 init 里面写了一百个参数,下面紧跟着一百个 self
纯属被 java 的 get set 洗脑了
1 nno 257 天前 纯粹就是水平问题,正常的 java 代码也不会一个构造函数塞 100 个参数啊 |
2 InkStone 257 天前 虽然整体上我赞同标题,但你贴的这个一点都不 Java 。 首先多参构造在 Java 里典型的做法是 Builder 模式,而不是全塞构造函数。其次就算是 Builder ,也没人会写 100 个参数的 Builder……肯定会拆成不同类型分级构造的。 另外你这里完全没有 getter/setter 相关的内容。 |
3 Valpha6 257 天前 kotliner 表示 "?" |
4 yosoroAida 257 天前 100 多个参数。。。。这哥们不能多创建几个类分割下吗。。纯粹水平问题+1 |
5 Goooooos 257 天前 Javaer 不是一个空的构造方法,new 完后再 set 吗? 谁会弄个 10 个以上的参数的构造方法? |
6 visper 257 天前 我觉得 java 味是 getter,setter, 各种 factory... |
7 rockddd 257 天前 现在 Java 都是用 lombok 注解,在编译的时候自动生成这些东西, 多少年前就不用手写了。 |
8 wuyiccc 257 天前 看看你写的 |
9 TimPeake 257 天前 这一看就是是编程助手 tab 写的啊 你们还真以为是手写的 ? 0912 年了 不太相信有人这么蠢 |
12 RandomJoke 257 天前 怎么感觉在黑 java |
13 wu00 257 天前 |
4 midsolo 257 天前 这个跟 Java 味无关,纯粹是个人水平问题。 真正的 Java 味是不管要做什么功能,先定义一堆对象,建几十个类再说,然后往里面套一堆设计模式,最后每个类就几十行代码,关键是自己还认为很优雅...... |
15 bronyakaka 257 天前 java 不都传对象嘛?这和 java 没关系吧 |
16 chihiro2014 257 天前 真要写这种不会用 lombok ,写个 NoArg 和 AllArg 的注解么? |
17 litchinn 257 天前 javaer 写啥都是 java 味儿这个没问题,但是截图这个不是 java 味儿,我体会到的 java 味是各种包装,各种抽象,各种继承 javaer 切换到其他语言确实很难改变这些习惯,因为 java 纯面向对象,虽然后面有了 lambda 表达式,但是用起来和 rust 里的闭包 match 等功能不是一个级别 |
19 sagaxu 257 天前 没见过这种 Java 代码,Java 味儿是搞一个 fluent builder Foo foo = Foo.fooBuilder() .setA("XXX") .setB("XXX") setC(1) .build() |
20 unco020511 257 天前 这种 java 得搞个 builder 或者叫 factory,反正怎么复杂怎么来 |
21 w568w 257 天前 歪个楼,我理解的 Java 味: - 所有东西建对象,还没开始写代码先在 model 目录下铺几十个 Java 文件 - 所有对象不用 public 成员,全部重写 setter 、getter - 不管用什么语言,一定要用 Java 的命名风格(文件和类名一致,类名大写驼峰,变量名小写驼峰),即使这语言里的标准风格根本不是这样 - 先抽象出 Beans 、Adapter 、Factory 、Manager 、Builder 、Delegate 、Runner 、Visitor… 即使是根本没有必要的小项目。然后把本来紧凑的几十行代码掰成几百行,再分散到二十个不同功能的文件里 - 到处用框架提供的注解,但实际上又不懂 JSR 里的注解 |
22 bxb100 257 天前 这和 java 有啥关系? 这不就抽象能力不足 |
23 herm2s 257 天前 这也能打上靶啊,你去写 Java 不也是一股 py 味 |
24 yusf 257 天前 你这就是典型的以偏概全,就看到一个 javer 写的代码就 aoe 全部 javer 了? |
25 worldqiuzhi 257 天前 Java 没这么写的 看不少 Python 脚本都是这么写的 |
26 leegradyllljjjj 257 天前 重构!跑路!删库! |
27 deplives OP @w568w 实时上已经这么干了 接手项目的第一天看完代码第一句话就是,这 Python 写的不行,没有层级结构,然后现在已经目录套目录了 新功能的第一次提交就是建了一堆空 py 文件 大小驼峰命名确定了 一个处理上传文件的功能恨不得拆了十个方法,到处调来调去,其实这些方法未来也只用了一遍 |
29 ZeroDu 257 天前 以偏概全,别乱黑。网上对 java 的恶意真大。而且写 java 的也不会这么写 |
30 deplives OP @SmithJohn 这就是硬解耦啊,总共加起来功能代码连不超过 100 行,A 函数里面就只调用了一个 B 函数,再加一个打印日志,然后 B 函数里面只调用了一个 C 在加打印日志。 这种解耦有意思么? |
32 mb4555 257 天前 big class hhhhhhh |
33 wolfie 257 天前 乐,这就是吐槽不到点子上的结果。 |
34 crysislinux 257 天前 via Android 我 jser 写后端也一股 Java 味了。 |
35 wolfie 257 天前 |
所以楼里出现了无码硬解。这么小规模的代码还怕没扩展空间? |
37 Loku 257 天前 我这个 javaer ,将代码写成了 Javascript |
38 javapythongo 257 天前 这怎么看着像一个 dataclass 啊?我看开源项目中的 dataclass 也有几十个参数啊?只是用了 BaseModel 少了 init 方法而已 |
39 FightPig 257 天前 看看腾讯的 ruby sdk, 那一眼看上去全是 java 味,而且有人提了几年了,他们也没改 |
40 niubiman 257 天前 真正的 java 味是一股巨难闻的味道, 比如, 明明号称是面向对象, 但是 java 的对象只有方法, 没有属性, 要从对象上获取一个属性, 不好意思, 你要 getXXX(), 这才是 java 最难闻的 |
41 cabing 257 天前 java 也不会这么写啊。它这个类不够简单,权责不发。 java 的 get 和 set 都有注解包好了。 |
42 niubiman 257 天前 还有, java 的泛型居然他娘的是设计时的, 曾经调侃 java 和 Javascript 的关系是雷锋与雷峰塔的关系, 现在大家可以大胆的说 java 和 Javascript 的关系是 typescript 了 |
43 kandaakihito 257 天前 你要喷也是喷 spring 仔,关人家正经的 Java 语言什么事情? |
44 kandaakihito 257 天前 算了,家访完楼主,释怀了。 |
45 sir283 257 天前 via Android 纯个人习惯罢了,op 以点盖全了。我也经常用 Java 那一套写 Python 、C/C++,可以看我的项目,跟语言没有关系,纯粹个人习惯。 https://github.com/MrsEWE44/easyManager |
46 listen2wind 257 天前 都是语言,搞什么歧视,能完成工作就行,你可以禁止别人在你负责项目写出带味的代码! |
48 Ghostisbored 257 天前 每次看到这种标题都无语 来来来 要不让大家看看你的代码 show 一下 |
49 3country 257 天前 ai 写的 |
50 xFrye 257 天前 跟 java 有什么关系?这代码也不 java 啊 |
51 fushall 257 天前 哈哈哈哈哈哈哈 笑不活了 |
52 zjsxwc 257 天前 所以为何不像 js 一样,如果变量名与对象的 field 一样,直接用语法糖解决 比如 你图片里的写法可以写成: return {state, cuser, ctime, muser} |
53 poorcai 257 天前 虽然我不是 javaer ,但是想看看你们这种应该怎么写啊?纯求教。 |
55 oamu 257 天前 @niubiman #40 Java 太老了,一些老的规范难以去改动,说它没有“属性”其实不太对,大可以把字段设置成 public 取得相似的效果,但真这样做了,大概率会和整个生态冲突( Spring 、JPA 都深度依赖 getter/setter 反射)。#42 还是那句话:Java 太老了,泛型是后面打补丁加上去的。JVM 设计之时就不支持泛型,同时也为了兼容之前的代码,所以设计泛型时,采用了类型擦除的方案。 曾经也是觉得 Java 一堆的糟粕,现在竟也觉得稳定能跑就行,缝缝补补又不是不能用,终究自己也是老了。 |
56 lyxxxh2 257 天前 |
57 InkStone 257 天前 @oamu public field 怎么会跟 property 一样呢? property 是 OOP 的,它可以在编程时像一个 field 一样被使用,但支持封装内部实现细节和多态。public field 既不能封装细节,也不能实现多态。 Java 味最突出的地方就在这里:因为语言层对 OOP 的支持不好,所以必须搞一大堆开发约定,来在开发中模拟 OOP (此处的 OOP 还可以替换成 FP 以及其他各种范式事实上 Java 对什么范式的支持都不好) |
58 AlexHsu 257 天前 java 早都培训完 lombol 了 这是典型的彩笔 pythoner 写的代码 |
59 Rat3 257 天前 其实我觉得只有烂仔才会开群嘲,人家一喷你就会灰溜溜的解释:我不是针对所有 xxx 开发者,我只是针对 xxxx 行为的 xxxx 开发者,有这个闲工夫真不如写好自己的代码跳个大公司,在开 AOE 干啥。 |
61 Rat3 257 天前 另外 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 ,所以出来群嘲? |
62 kinkin666 257 天前 这是 MFC 的味吧 java 如果不弄 factory 和 builder 的话,都是 0 参构造函数,实例化完了再一个个 set 进去 也有可能他就没想着让这个类直接给别人、别的地方实例化,故意不留 0 参构造函数 |
64 jqtmviyu 257 天前 前端纯好奇请教: 后端都是这种继承类的面向对象写法吗? 如果小项目还没到需要考虑拓展(实例小于 3), 写成面向过程会怎么样? go 的主流写法呢? 之前学语法的时候, 好像当成有类型的 js 思路写也没什么问题. |
65 niubiman 257 天前 @jqtmviyu 并不是后端都是 oop 的写法, 是 java 号称是 oop 的, 却很不 oop, 所以一股怪味, 其他能做后端的语言一大把, 有 oop 的, 也有 fp 的, 甚至还有混合范式的, 只跟语言有关, 跟前后端无关 |
66 nullpointerskz 257 天前 java 味的项目 20 年过去以后换一批人来照样可以维护,你是 python 味的? Python2 和 Python3 都不兼容? python 作者写的代码过几个月都看不懂是啥了? |
67 oamu 257 天前 @InkStone #57 别偷换概念,我可没说 public field 跟 property 一样,说的是属性( attributes )。你对于面向对象的理解是什么呢?一定要支持 property ?不支持 property 的语言多了去了 C++、GO 、Rust 都不支持,难道它们对面向对象支持都不好? |
68 InkStone 257 天前 @oamu C++:对,不好。Java 不就是学的这一套么 Go ,Rust:对,不好。Go 就不说了它缺的也不止这一个; Rust 这点没少被人吐槽,经常有人问“如何实现数据 mixin 而非只是接口 mixn” |
69 PhonRT 257 天前 黑 javaer,V 站政治正确 |
70 niubiman 257 天前 @oamu #67 你这个可以说是给自己举了大大的反例了, 首先 c++作为 oop 的编程语言没有 property 也是它的一大槽点之一, 而 go 和 rust 又从来不标榜自己是 oop 语言, 你用这三个语言举例不正好说明了 java 的 oop 标签不就是一坨吗 |
72 kristofer 257 天前 呃...以你贴的代码来说,这代码一点 Java 味都没有。还有就是你写过几种语言啊,还搞出语言歧视链了,一般不都是 Java 歧视 Python 吗 |
73 Rat3 257 天前 @niubiman #63 我理解你的说法,但是我觉得 OP 完全没有在攻击 java 本身特性的情况,他把 GET/SET 的写法等同于 java ,然后他完全不认可这种写法,再基于自己的认知在攻击 java 开发者,认为只有 java 开发者才会这么写。 |
74 InkStone 257 天前 @oamu 有些语法糖,有就是比没有好,没有什么讨论余地。JVM 上的其它兼容语言,Scala 、Groovy 、Kotlin ,都支持 property 语法糖。其它新一点的主流面向对象语言也基本都支持,连 Java 自己都要搞 Beans 标准,搞 Lombok ,都不是没有原因的。 Python 别的不敢说,在 OOP 这方面吊打 Java 肯定是没问题的当然,因为能在 OOP 方面吊打 Java 的语言太多了,这倒也算不上什么优点。 |
75 Rat3 257 天前 我是觉得 OP 因为见识(知识)相对匮乏,从正文看,OP 认为这种 Get/Set 的写法是 Java 独有的,基于这个前提再加上不认可 Get/Set 写法,来攻击 Javaer ,我是蛮费解的 |
76 RuLaiFo 257 天前 这一点都不 java ,纯粹是你同事代码习惯差,你也多学学 java 吧 |
77 qiuhang 257 天前 你说这种还好,就是参数多点,也没加什么参数校验什么的。多加点参数校验你就会发现跟很多开源框架一样的...... 真正的 java 味 python ,你应该看看阿里云的 python 版本 sdk |
78 lfitzgerald 257 天前 |
80 FrankAdler 257 天前 同事写的 go 也全是 java 味道,恶心的都不想碰那些代码 |
81 muyiluop 257 天前 哈哈哈,我也是写 Java 的 |
84 aboutier 257 天前 喷来喷去就那两个点。 没什么新意, 和老太婆的裹脚布一样。 |
85 to2false 257 天前 @FrankAdler 是这种 https://github.com/go-spring-projects/go-spring 吗?万物皆 spring |
86 ltaoo1o 257 天前 @Meld #61 从没写过 java ,我 js 就是这么写 ```js function Person(props) { let _name = props.name; return { get name() { return _name }; } ); ``` |
88 msg7086 257 天前 这和 Javaer 啥关系啊,这就只是代码写得烂而已,这也能和 Java 扯上关系啊。 |
89 silvernoo 257 天前 @lfitzgerald #78 这味道才叫正 |
90 FrankAdler 257 天前 via Android @to2false 比这恶心吧 啥 dto vo provider builderr 链式 都搬过来了 |
92 DeWjjj PRO 喜欢面对对象写法的人,确实是喜欢把任何东西都封装成件。 我特别喜欢写管子,都是管子风格。 |
94 zhaokun 256 天前 这不是 javaer ,别用你认为的这是 javaer 写的定义 javaer |
95 myk889090 256 天前 PHP 是世界上最好的语言 |
96 mayli 256 天前 其实差不多,如果真的有这个 100 多个参数的需求,除了__init__可以用 dataclass 省一些,构造的时候也还是得继续传 100 个进去。可能要是拆一下会好一点,但是业务就这么要求也没办法。 getter setter 那个对于 py 真没必要。 |
97 maix27 256 天前 不是 javaer 写啥都 java 味,是只会 java 的人写这样的,多学几门语言呗,别做某一门语言的舔狗。 |
98 jeesk 256 天前 提个问题: 1. 如果你需要排查某个属性到底是在什么地方修改的? 直接使用属性访问,然后调用的地方有 10 处,你如何排查? 在每个调用的地方加 10 个断点,加 10 行打印日志? 如果你使用 set 方法,打一个断点就够了。 2. 如果你要自定义处理某个字段的返回 value. 如果你是提供的框架第三方使用呢? 要让开发者在所有调用的地方将属性访问,修改成调用方法? 难道将调用的 100 个字段都修改吗?如果用 getter() 只修改 getter 里面的内容就行了。 3. 如果你不确定是否要限制某个设置值,然后在未来某个版本要限制了, 这个时候难道要废除属性访问? 有些字段提供 getter,setter, 有些字段不提供 get/setter ? 开发者会不会骂娘? 你就是一个菜鸡,代码为你自己写,没有考虑到各种兼容性,调试,和 review 等相关问题。和语言无关。 |