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