Bingchunmoli
V2EX  ›  程序员

关于 Java 很重有感

By Bingchunmoli at 2022 年 5 月 10 日 · 17140 次点击
  1. 感觉很多人对 java 还停留在 j2ee 时代,不过 java 还在 jdk 还在 1.8 ,就不需要谈了。
  2. 今天写前端突然发现前端的路径也是他们俗称的臭长,明明一个 model/LoginInfo.ts 就能创建为 api/interface/LoginInfo/index.ts 特别是 index.js index.ts 都是创建文件单一个 index 明明如果不是多个就叫 router.ts 就好了嘛,不知道有什么特殊的吗。
  3. 我觉得有一句话我挺认同的,路径长,一个是便于管理(很多写路径规范吧,或者跟着教程学的就是这样),一个是和语言无关,和写代码的人有关。毕竟还有的人接口前面带 I 有的人不带的。没有对错之分。
142 条回复  •  2023-06-14 00:25:14 +08:00
第 1 页
共 2 页
12
codefever
   1
codefever  
   2022 年 5 月 10 日
历史包袱太重,存在不少过度设计,没有从头来过的勇气只能继续堆砌,但是新版本+甩掉包袱还是可以比较轻的
libook
   2
libook  
   2022 年 5 月 10 日
基本都是人为因素,语言提供了灵活性,有没有选择最佳方案去运用就是个人能力的问题。
而且一个项目之所以成为了现在的样子,肯定是因为这个项目的整个发展历史,那么只从当前状态去评价一个项目就不大客观了,因为很多时候是因为历史原因导致现在是现在这个样子。
TWorldIsNButThis
   3
TWorldIsNButThis  
   2022 年 5 月 10 日 via iPhone   ❤️ 15
java 的蠢点在于
很多人刻意建几层 reverse domain name 的文件夹
什么 com / example / xxx
一股浓烈的裹脚布的臭气

你可以说 Java 语言本身没这个要求,但现实就是这种行为和 Java 是强绑定
wolfie
   4
wolfie  
   2022 年 5 月 10 日   ❤️ 5
@TWorldIsNButThis
类名冲突了怎么办。
com.alibaba.MathUtil 、com.tencent.MathUtil ,没有前缀就冲突了。
statumer
   5
statumer  
   2022 年 5 月 10 日
Spring Boy 先摆脱同步阻塞 JDBC, 被滥用的 threadlocal 和 tomcat 的并发模型再来说 Java 不重
liuzhaowei55
   6
liuzhaowei55  
   2022 年 5 月 10 日 via iPhone   ❤️ 14
看了楼上的发言忽然知道 go 为啥火了,根目录写代码,直接一把梭 😂
yxcxx
   7
yxcxx  
   2022 年 5 月 10 日
go 引包也是 "github.com/xxx/xxx"
devtiange
   8
devtiange  
   2022 年 5 月 10 日   ❤️ 2
@wolfie 看一下 c#, 并不需要套一万层目录
461da73c
   9
461da73c  
   2022 年 5 月 10 日
@liuzhaowei55 简直不能更方便了,不过 go 非常流行 /pkg 下写代码这一套。
chendy
   10
chendy  
   2022 年 5 月 10 日
1. 其实某种意义上现在还是 j2ee ,还是 servlet ,jpa 啥的,只是被封装掉了不会直接用到了( jdbc 是 se 的不是 ee 的)
2. 分包分模块这个依赖语言特性,java 属于啥机制没有,为了不冲突只能一层又一层,但是习惯了也就那回事

3. 线程模型啥的……一来基本没得选,二来广大一般程序员也驾驭不住太复杂的模型,简单好用才是真,出了问题解决不了对公司和客户都不好
lujiaosama
   11
lujiaosama  
   2022 年 5 月 10 日
前端不是过度封装很难写出一层又一层的结构目录.
Bingchunmoli
   12
Bingchunmoli  
OP
   2022 年 5 月 10 日
@TWorldIsNButThis 没有框架之前都是 com 包一把梭,后来因为 spring 要扫包,就开始 com.域名了,不过除了开源的项目,公司项目完全可以,com.公司域名,一把梭,没必要再跟.项目名.** 什么的分下去
Bingchunmoli
   13
Bingchunmoli  
OP
   2022 年 5 月 10 日
@statumer 作为入门新手,threadlocal 和 tomcat 的并发模型 没怎么用过 听说 tomcat 也已经 nio 了 这不是已经是最好的了。 JDBC 性能好像没什么人提 不清楚,难道是 druid 的问题吗。
Bingchunmoli
   14
Bingchunmoli  
OP
   2022 年 5 月 10 日
@codefever 包袱确实很重,Date 不推荐但仍然在用,Random 、JSP 仍然在教
Bingchunmoli
   15
Bingchunmoli  
OP
   2022 年 5 月 10 日
@libook 是的,之前的公司就是一直堆需求,每次都是能上线没白屏(to C)就是万世大吉, 没有事务,堆同一个服务,堆代码
libook
   16
libook  
   2022 年 5 月 10 日   ❤️ 1
@Bingchunmoli #14 比较有经验的架构师会在提出一个技术方案的同时提出配套的重构方案,如果重构方案延后实施就是技术债务,有良好还债节奏的项目不会越来越糟糕。
statumer
   17
statumer  
   2022 年 5 月 10 日
@Bingchunmoli tomcat 的并发模型是让每个线程负责一个请求-响应流程,真正的高性能架构每个线程可以同时处理上千个请求-响应流程。去了解一下 reactor 吧。
byte10
   18
byte10  
   2022 年 5 月 10 日
@Bingchunmoli 你都没有理解#5 楼的话。。。建议你看看那个 B 站《 NIO 绝对优势》: https://www.bilibili.com/video/BV1FS4y1o7QB ,你才知道啥是 NIO ,才明白 5 楼表达的 JDBC 同步阻塞问题。tomcat NIO 提升吞吐量很有限,因为底层就是 JDBC 就是同步阻塞的。 但是没有几年的经验可能看不懂,可以多看几遍。
billlee
   19
billlee  
   2022 年 5 月 10 日 via Android
@byte10 JDBC 同步阻塞真的是关键问题吗,毕竟数据库那边也是同步阻塞的
Bingchunmoli
   20
Bingchunmoli  
OP
   2022 年 5 月 10 日 via Android
@byte10 ok ,io 这块不太熟。
dcsuibian
   21
dcsuibian  
   2022 年 5 月 10 日
换语言对于”历史包袱“指标不治本,就是下一次轮回而已
2NUT
   22
2NUT  
   2022 年 5 月 10 日
@wolfie #4 别的语言为什么没采用这种方式呢?
pengtdyd
   23
pengtdyd  
   2022 年 5 月 10 日
为啥没人说 C 很重呢?
cheng6563
   24
cheng6563  
   2022 年 5 月 10 日
@statumer Java 又没协程,把 servlet 和 jdbc 丢掉又有什么用?常规的 curd 业务代码换用 vert.x 那套来写不得花 3 倍时间?
Chinsung
   25
Chinsung  
   2022 年 5 月 10 日
@billlee #19 叕叕叕看到有人吹 NIO 了,NIO 固然厉害,但是建议楼主了解 NIO 原理和 netty 就行了,至于说 JDBC 因为同步阻塞不用的更是有点牛,大部分复杂点的业务都是要大量 sql 的,你不会把依赖上下文的 sql 写回调里或者手动 block 吧,不会有人喜欢这么写业务逻辑吧,不会吧不会吧。spring 自己都推不动 spring boy 用 spring reactive ,咋办呢?
Vegetable
   26
Vegetable  
   2022 年 5 月 10 日   ❤️ 2
人家是 src/api/interface/LoginInfo/index.ts
java 是 src/main/java/com/example/api/services/LoginInterface.java ,旁边还有一个 LoginInterfaceImple.java

前端就是再长也长不过 java 啊
java 本身没什么,关键是写 JAVA 那些所谓的规范
statumer
   27
statumer  
   2022 年 5 月 10 日 via iPhone
@cheng6563 Java 提供不了这样的基础设施,Spring Boy 整不明白异步编程,综合起来可不就构成了 Java 性能差劲的印象么?
BeautifulSoap
   28
BeautifulSoap  
   2022 年 5 月 10 日
最近学 Kotlin ,当我知道 Java 一个文件里只能定义一个公开类的时候,我是震惊的
dcsuibian
   29
dcsuibian  
   2022 年 5 月 10 日   ❤️ 20
@pengtdyd 我之前也有这个疑问:Java 天天人人喊打,但 JavaScript 、C 、C++就没什么人提。
后来想明白了,js 之于浏览器、C 之于嵌入式、C++之于游戏基本上都是不可替代的(就是打不过),但 Java 之于后端不是。新出的语言又大多是上层的,是个语言都能写后端。因此人人都想 battle 一下。
但这么多年都没打下来,说白了就是 Java 确实好用罢了。
byte10
   30
byte10  
   2022 年 5 月 10 日
@billlee JDBC 同步阻塞是真的问题,会导致 NIO 无法被真正使用上来。如果想理解为何,可以看看我的那个教程。我的那个教程有一个 Nodejs 写的服务,如果你用 java 传统的同步阻塞去调用,那么性能很慢,用异步去调用就快很多了。我的那个视频讲解有讲为何 NIO 能做到无视 IO 时间,依然保持高水平的吞吐量。你也可以请教一下评论区的其他网友, 他们也是懂的。
Mohanson
   31
Mohanson  
   2022 年 5 月 10 日   ❤️ 5
本质是 OOP 的问题.

"以 OOP 设计为导向的语言的问题是每个变量都随身携带着全部隐含环境. 您想要一个香蕉, 但您得到的是一只拿着香蕉的猩猩, 甚至它背后的整个丛林." - Erlang 创造者 Joe Armstrong
nekoneko
   32
nekoneko  
   2022 年 5 月 10 日   ❤️ 1
@statumer #27 你说的这些跟 java 有什么关系呢, 异步编程 quarkus 就主打异步编程呀, spring 又有异步编程组件呀, reactor 跟语言又有什么关系呢? 是 java 没法实现 reactor 还是 java 没法实现 nio 了呢
billlee
   33
billlee  
   2022 年 5 月 10 日 via Android
@byte10 我觉得那个视频说的很对,我也认同阻塞会导致 NIO 失效。但 JDBC 是连接数据库的,数据库服务端还是同步阻塞线程模型啊,我们就算实现一个异步的数据库客户端,那还是大家一起在数据库服务器的线程池上排队。
lizhesystem
   34
lizhesystem  
   2022 年 5 月 10 日
怎么天天有人讨论这种问题?
statumer
   35
statumer  
   2022 年 5 月 10 日
@nekoneko 我说的是 Spring Boy 没资格说 Java 不重,而不是 Java 本身很差。实际上 Java 性能很强,HotSpot JVM 的优化在 GC 语言里是顶尖水平,techempower 打榜日常前十。拜托先看明白我在说什么。
liy333
   36
liy333  
   2022 年 5 月 10 日 via iPhone
NIO 首先要区分是操作系统的 NIO ,还是 Java 的 NIO 。Java NIO ,N 表示 New ,它其实是 IO 多路复用。一般说的 NIO 是非阻塞 IO 。IO 多路复用一般都是使用 Reactor 模式实现,Java NIO 也是基于该模式。IO 多路复用是为了处理大量 IO 问题,比如一万个请求,用 BIO 需要一万个线程,IO 复用只需要几个线程。处理数据的效率不是它关心的,但为什么使用 IO 复用能提高接口的响应时间?因为原本用来处理连接的资源被节省下来用于处理数据。IO 复用只关心处理连接的效率即可,不要跟处理数据混为一谈。
Suddoo
   37
Suddoo  
   2022 年 5 月 10 日 via iPhone
@cheng6563 好消息,Java 支持纤程了

https://openjdk.java.net/jeps/425

现在已经 preview 了
heeeeeem
   38
heeeeeem  
   2022 年 5 月 10 日
@TWorldIsNButThis 啊 这不是人蠢吗?你嘴巴吃布了吧
Chinsung
   39
Chinsung  
   2022 年 5 月 10 日
@statumer #35 啊确实,根据 idea 的统计,用 java 的里面基本还是 spring boot 和 tomcat 称王,说明全世界的 javaer 基本都是你嘴巴里不懂 NIO 的 spring boy
https://www.jetbrains.com/zh-cn/lp/devecosystem-2021/java/
java 厉害,但是 java 里最流行的框架 spring 不行,你不觉得你精神分裂吗?
不知道你用的什么完美语言,竟然都让你用出优越感了,我有点想学习下新语言了
byte10
   40
byte10  
   2022 年 5 月 10 日
@billlee 额,你不能这样的分析哦,你分析问题要看整体。至于 mysql 里面是怎么运行,你只要需要知道 mysql 能到多少的吞吐量就可以了,你要把 mysql 考虑成一个整体,它吞吐量是多少就说明 java 最大的吞吐量上限是多少。。。。关于”那还是大家一起在数据库服务器的线程池上排队“, 这个排队在 mysql 服务里面,对于客户端无所谓,客户端完全不关心你啥时候返回,客户端可以等 1 分钟都可以等得起。

换句话说,如果没有 JDBC-NIO 客户端,那么 Java 的 NIO 服务就无法用起来了,多线程依然会存在 java 服务中,如果 NIO 客户端,那么 java 就不用关注多线程了,它不需要考虑 mysql 的响应时间来调整线程数。不过 NIO 需要考虑背压,不然无脑的请求下游服务会出问题。
statumer
   41
statumer  
   2022 年 5 月 10 日 via iPhone   ❤️ 2
@Chinsung
你是怎么做到 JVM 的性能和 Spring 的性能都能混淆的?
是不是在你的心目中 Spring 就是唯一的、不可亵渎的神?
我忏悔,我侮辱了 Java 世界的 One True God🤣
建议 Kafka 用 Spring 重构,自己封装 Java NIO 用 reactor 太落后了。
zmal
   42
zmal  
   2022 年 5 月 10 日
op 最好从一个具体的场景或问题出发,不然这个问题无法讨论。
Chinsung
   43
Chinsung  
   2022 年 5 月 10 日   ❤️ 2
@statumer #41 你这种人确实真心让人懒得理你,spring 作为一个容器,确实大大的影响了 JVM 性能,你自己看看你自己前面说的都是什么东西吧,你说 Spring 阻碍了 DDD 还算你懂点东西,Spring 影响了 java 性能那你真是天才,我寻思是 Spring 提的 JDBC 和 J2EE 规范是吧? Spring 确实不是 One True God ,但是在你看来 Spring 就是 Java 的 original sin ,建议你大力推广下别的框架来拯救 Java 生态,让那 60%+的全世界 javaer 认清 Spring 的丑恶嘴脸
Joker123456789
   44
Joker123456789  
   2022 年 5 月 10 日   ❤️ 2
@TWorldIsNButThis 不懂极少说几句好吧,java 的包名是为了 让类名唯一 才这么要求的。

比如 你写了一个 jar 包 有个类叫 StringUtils ,spring 里面也有一个类叫 StringUtils ,当这个 jar 包和 spring 被一起使用的时候,就会出现类名冲突。(千万别跟我杠你不会重复造 StringUtls 的轮子,我只是举个例子,你如果纠结 StringUtils ,那你不妨忽视他,想一个别的名字)

为了解决这个问题,所以出现了 类全名,类全名就是:包名.类名, 类名没办法去规范,总不能限制别人取什么类名吧? 所以只好限制包名了啊, 包名的规范是 倒置的公司域名(或者个人域名)+ 项目名 + 模块名, 域名就把范围限制在了 一个公司 或者个人,项目名 就进一步缩小范围 到团队,模块名 进一步缩小了范围。

就算再怎么蠢,也不至于在一个模块里出现同名类吧? 所以问题得到了解决。

你可能还会说:长就是长,没得洗,ok ,那我问你,go 的 import 后面的那一段短吗? nodejs 的 import 后面那一段短吗?

在源码里面,包名还有另一个身份,那就是目录,你写 go 不用分目录吗? 写 nodejs 不用分目录吗?
really28
   45
really28  
   2022 年 5 月 10 日
难道分目录不是为了更好维护吗。。。 特别是大项目 + 多人开发的时候
Joker123456789
   46
Joker123456789  
   2022 年 5 月 10 日   ❤️ 5
很正常,很多人就是学了点新语言,趁着新鲜感 就出来秀一秀优越感。 如果真让他们用两种语言 写同一个业务逻辑,代码量 肯定是半斤八两的。

至于 get/set 之类的, 这不是规范的锅吗? 跟语言有个屁关系,想偷懒的人 完全可以 把成员变量定义成 public 。

而且 java 的 三方库 非常丰富,官方库 也很丰富, 开发起来 效率到底有多低呢?
AllenHua
   47
AllenHua  
   2022 年 5 月 10 日
有了 idea 这种工具,觉得这不是问题,虽然看起来、阅读起来比较“麻烦”,但正因如此,项目结构清晰,信息量大,也容易理解。
james122333
   48
james122333  
   2022 年 5 月 10 日
@Chinsung

语言本身与框架本来就要分开来看 不是流行就是真理
spring 与没有动态反射的确实会有性能差异 感觉还是自己写爽多了

@TWorldIsNButThis

会有重复类名 真正的问题在于 java 并没有 import as 导致你要写完整包路径
mekingname
   49
mekingname  
   2022 年 5 月 10 日   ❤️ 9
@Joker123456789

![]( https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/20220507165820.png)
![]( https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/20220507170149.png)

在 Github 上面,随便用一个关键词找 Java 代码,就会发现全都是这种嵌套十几二十层的结构。

如果只有一两个项目这样写,我可以说是程序员的问题。但是几乎所有 Java 项目都是这样组织代码的,只能说明是 Java 生态圈的问题,Java 的开发模式就鼓励这样写。而且,Github 上面,绝大部分的项目代码量连 500 行都没有,但是文件夹嵌套了几十层。

连个代码文件组织都搞得这么繁杂冗余,窥一斑而见全豹,Java 这个语言,无论是语言特性,还是生态环境,还是开发模式,都又笨重,成本又高,部署又麻烦。

Go 也要分目录,Node.js 也分目录,Python 也分目录,但谁吃多了没事嵌套几十层目录呢?别的编程语言目录是水平扩展的,Java 的目录是垂直扩展的。以你的例子,我自己的 StringUtil ,我直接在根目录创建一个 MyStringUtil 文件夹就放了不行?腾讯的 StringUtil ,就叫做 TencentStringUtil ,都放到根目录,就一层文件夹。简单又清爽。为什么要嵌套 com/xxx/yyy/zzz/mmm/tmd/fuck/shit/mmm/StringUtil?

你打开 Github ,同一个关键词,搜索,然后看不同语言的项目。只要 Java 会嵌套这么深的文件夹。其它语言哪来这么深的嵌套?难道只有 Java 程序员才懂软件工程,其它语言的程序员都不懂,写的都是玩具?

你看到所有人都在逆行,难道你不想想其实别人的方向是对的,Java 自己在逆行?
ipwx
   50
ipwx  
   2022 年 5 月 10 日   ❤️ 2
@mekingname ummm 你的理由我认同,但我觉得你的例子不太妥当。

TencentStringUtil 不行,你得至少用 tencent/StringUtil 。

不过话说回来,我觉得问题的核心是,别的语言都会用下划线,比如 "flask_wtf"。到 Java 这边至少也得是个 spring.xxx.yyy ,就是不喜欢平行扩展命名空间用分隔符。这才是嵌套目录深的原因。
mekingname
   51
mekingname  
   2022 年 5 月 10 日   ❤️ 1
@ipwx 你说的对。我认为,要创建一个文件夹,必须要保证这个文件夹下面至少有两个文件,这样的文件夹才有意义。如果只有一个文件,那么直接把这个文件放到最外层就可以了,根本没有必要用文件夹。
Chinsung
   52
Chinsung  
   2022 年 5 月 10 日
@james122333 #48 我也没说过流行就是真理,只是 spring 的缺点也和这个人所谓的性能没有任何关系,稍微了解一点 spring 的人也知道 spring 只是一个容器和规范,除了 MVC 之外几乎全部是依赖第三方开源的支持,spring 自己除了 mvc 和 bean 管理,其他全都是定义的扩展让各种框架和三方库去集成进项目而已,spring 一个基本既没有实现线程池也没有实现连接池的东西,基本代码都跑在 tomcat 工作线程里的东西,除了依赖比较多的反射实现注解,有什么讨论性能并且和 NIO 拿来 PK 的必要? spring 再有缺点,和他说的东西也没什么关系吧?
更别说现在 GraalVM 支持预编译但是又不能用反射了这件事多被诟病,反射切面只是设计方式,人们用它只是方便,spring 也没强迫你用
WispZhan
   53
WispZhan  
   2022 年 5 月 10 日 via Android   ❤️ 1
@dcsuibian
当年《 WOW 》也是这样,随便来个 MMORPG 就来 battle 一下
WispZhan
   54
WispZhan  
   2022 年 5 月 10 日 via Android
就没人聊聊 JVM 的其他语言?
SoloCompany
   55
SoloCompany  
   2022 年 5 月 10 日   ❤️ 2
楼主真是角度清奇, 万万没想到连名称空间都能作为吐槽点开喷

看来大家都很喜欢玩 1.0 的 npm 抢包名的游戏
unregister
   56
unregister  
   2022 年 5 月 10 日   ❤️ 1
@TWorldIsNButThis 你语气让人很不爽,就你🐂?还一股浓烈的裹脚布的臭气?
Duolingo
   57
Duolingo  
   2022 年 5 月 10 日   ❤️ 1
我再强调一遍,语言只有被人骂的和没人用的两种(手动狗头
chihiro2014
   58
chihiro2014  
   2022 年 5 月 10 日   ❤️ 1
异步不一定快,同样同步不一定慢。
完
haah
   59
haah  
   2022 年 5 月 10 日   ❤️ 2
操作系统算不算“重”?
searene
   60
searene  
   2022 年 5 月 10 日
Java 的好处在于生态极其完善,语言虽然稍微啰嗦点,但是没有什么大问题,这对于一个企业来说就够了。
levon
   61
levon  
   2022 年 5 月 10 日
@codingadog 严重同意
gjquoiai
   62
gjquoiai  
   2022 年 5 月 10 日
没写过 java ,java 不支持 import alias 吗?就像 python 的 import xxx as yyy 和 golang 的 yyy "github.com/xxx/xxx" 一样?
RedBeanIce
   63
RedBeanIce  
   2022 年 5 月 10 日   ❤️ 1
写大量业务代码不分 pkg 包,重构 or 迁移的时候就知道痛苦了。
正如网上嘲讽本科学历 5%一样,我也嘲讽一下,真的有人写业务代码嘛
Bingchunmoli
   64
Bingchunmoli  
OP
   2022 年 5 月 11 日 via Android
@byte10 我们项目是强制三秒超时的。。qaq
Bingchunmoli
   65
Bingchunmoli  
OP
   2022 年 5 月 11 日 via Android
@mekingname 说的是这个理,一般正常点项目 service 都是几十个,感觉还想分一下,vue 的 router 和 store 没见过几个文件的都是 index.ts 或者 js 感觉额外增加了文件夹
rykinia
   66
rykinia  
   2022 年 5 月 11 日   ❤️ 1
@mekingname 你骑自行车去 200 米外的菜市场买菜,一脚蹬穿插两下就到了,架子一放就停了;你开汽车去 200 米外的菜市场买菜,还要严格遵守交通规则走机动车道绕路,找停车位停车。这时你说骑车轻松,开车累,是没问题的。

但是你从浙江去广州,那就不一样了,前面场景中操作汽车麻烦的点,在这个场景显得无足轻重,同时,规则带来的好处也大于了麻烦。
lawler
   67
lawler  
   2022 年 5 月 11 日   ❤️ 3
编程语言拉踩赶上月经了。

所谓的 Java"很重",是指 runtime ,因为需要预分配大量计算机资源。

至于文件夹 /路径和文件命名问题。在"功能"开发上是没有意义的,这类多为脚本类型语言,单一、且避免扩展。在"业务"开发的意义是为了有计划的实现扩展。与"重"无关。
micean
   68
micean  
   2022 年 5 月 11 日 via Android   ❤️ 3
有的人能把屋子收拾的整整齐齐,有的人家里跟遭了贼似的
都能住人么不是
Buges
   69
Buges  
   2022 年 5 月 11 日 via Android
@Joker123456789 类全名规范完全是过度设计,真没什么好洗的。一层命名空间能解决的问题搞出一大堆,尤其是一堆堆只有一个子项的目录嵌套 src/main/java/com/example/Xxx.java 这不是多此一举么。我只在乎我用的 StringUtils 是项目中导入的哪个库里的,而不想关心它 com.tencent 还是 org.apache 家的。
echo1937
   70
echo1937  
   2022 年 5 月 11 日   ❤️ 9
有些人就是蛋疼,只要某个领域出现若干占主导地位的一站式框架,就会有约定大于配置,就会有一堆脚手架。

我以前写 JQ 一把梭,现在不到 5 个页面的项目也要起个 Vue 、React 项目,是不是表示 JS 也“很重”?

这不是叫工程化吗,和语言重不重有毛关系啊。
hhjswf
   71
hhjswf  
   2022 年 5 月 11 日
@mekingname 可是项目工程化,我怎么知道未来到底几个文件,不为未来预留一点空间吗。就像设计模式原则一样,对修改关闭,对拓展开放
rockddd
   72
rockddd  
   2022 年 5 月 11 日   ❤️ 1
你们吵到我搬砖了[doge]
securityCoding
   73
securityCoding  
   2022 年 5 月 11 日
@Suddoo 协程出来后提升也有限,应用层面无非是资源占用少些,但是有多少应用会开成千上万个线程呢,毕竟 java 有个线程池大杀器在那里,go 协程作为其标志性代表鹅厂内部 go 类型 rpc 服务也同样采用了协程池。
BQsummer
   74
BQsummer  
   2022 年 5 月 11 日
TencentStringUtil 是真的蠢, 那不是所有类都叫 TencentXXXX 了
vincent7245
   75
vincent7245  
   2022 年 5 月 11 日
真的是日经贴啊,就静静地看你们吵架
mekingname
   76
mekingname  
   2022 年 5 月 11 日   ❤️ 2
@hhjswf
编程语言这么多,难道其它语言的程序员都不懂工程化?其它语言的程序员都不懂得为未来预留空间?其它语言的程序员就能预测未来有多少个文件了?其它语言的程序员就不懂得设计模式的开闭原则?为什么只有 Java 嵌套这么深,其它语言都没有这个问题?
mekingname
   77
mekingname  
   2022 年 5 月 11 日
@BQsummer 创建一个 tencent 文件夹,然后把相关的 StringUtil.java , XXX.java 直接放到这个 tencent 文件夹里面就可以了。总共只需要 1 个文件夹。
mekingname
   78
mekingname  
   2022 年 5 月 11 日
@rykinia 你说的没错,前提是规模要足够大。但我从 Github 上面,随便搜索任何关键词,C++项目 50w 行代码,嵌套的文件夹不超过 10 层;而 Java 大多数项目,代码行数不超过 1000 ,但是嵌套了几十层。给人的感觉就是,Java 程序员连下楼扔个垃圾都要开车。
zhennann
   79
zhennann  
   2022 年 5 月 11 日
Java 命名冗长是事实,不利于源码阅读。一个开源项目代码行数本不多,就是因为嵌套层级深,想快速扫一遍源码很不方便。如果要实现命名的唯一性,可以考虑 CabloyJS 框架中模块名称的命名规范:{providerId}-{moduleName}。providerId 可以是项目名称、可以是公司名称,虽然从理论上无法 100%避免冲突,但是通过工程实践上的约定是可以做到的,这就体现了一种克制、平衡的策略,而不是像 Java 那样一个域名撸到底
jy02201949
   80
jy02201949  
   2022 年 5 月 11 日
@wxw752 头像跟评论很搭
sun1991
   81
sun1991  
   2022 年 5 月 11 日
奇怪为什么没人提一出错就是上百层的 stacktrace?
zakokun
   82
zakokun  
   2022 年 5 月 11 日   ❤️ 5
我一条条看了回复,主要是如下几类:
java 是干大事的语言,所以文件夹多是应该的;
你就是羡慕嫉妒恨,拉仇恨的;
go 是垃圾语言;
做前端的都是垃圾;
你应该去研究研究 XX 技术就懂了;
java 是领导者,其他语言都在 battle 它;
楼主闲的蛋疼;
你是不是傻逼居然不会建文件夹;
别的东西比 java 重多了,你怎么不说其他东西;
楼主没做过大工程,没经验;

我看到 80 多楼了也没人解释明白为啥 java 项目文件夹都这么深?我之前接手了一个业界大厂的 java 项目,文件夹是这样的:




不可笑吗?一层层的全是单文件夹没其他东西,idea 甚至有合并文件夹路径功能,它扫描到你全是单文件夹就直接定位到最深的一层文件夹,也是一大亮点了。
Bingchunmoli
   83
Bingchunmoli  
OP
   2022 年 5 月 11 日
@zakokun 我没有说域名反写并且以.分割做文件夹方式很好,他是 java nasmespace 历史包袱的一部分,抛开域名,而且域名反写通用的是 com.alibaba.fastjson (作为一个项目) 公司内部一般是 com.公司域名.service 了,只有两层,后面和前端类似的是分功能创建,这个 nemaSpace 是个槽点,我并没有进行否认 你这个截图我不敢苟同,我一般都是超过两个文件才会创建文件夹,写前端发现前端都是 router/index.js 这种写法才有感, 我们的 service 下面就是接口没有再分层,即使 35 个 service 接口,和超过 35 个 serviceImpl,只是 impl 继续放在了 impl 如果放外面 也可以,但是比如策略模式的 service 明显放 impl 里更清晰,一个 payService 下面有 aliPayService , 有 tencentPayService 有** PayService 做策略工厂,全部在外面因为起名 a t 排序问题可能更不容易找到。
1rror
   84
1rror  
   2022 年 5 月 11 日
我也挺好奇为什么 java 项目的文件夹为什么这么深,我写 C#项目很少超过 3 层,写 java 的时候看见别人套了好多层,我就照着也套很多层...
userforg2021
   85
userforg2021  
   2022 年 5 月 11 日
@zakokun 哈哈哈,血压上来了。之前看一个开源项目。八九层源码文件夹点开,里面两个文件。再看测试,也是八九层文件夹,点开就一个文件,还是占位的。当场就跪了。
Joker123456789
   86
Joker123456789  
   2022 年 5 月 11 日   ❤️ 4
@mekingname 几十层??? 有偏见就直说吧,没必要装瞎子好吧? 你睁大眼睛再去数数。 而且你真的懂 java 吗? src/test/java/ 这是 maven 的目录, 根本不需要人写。 再前面一点是项目的名称。 后面就是包名了。

包名为什么这么长,我已经解释过了,你家的 go 确实没这么长,但是你看看源码里 import 后面有多长? 这个问题 go 不是用目录来解决的罢了,但一样需要解决这个问题,而且也不见得优雅!!

[
我自己的 StringUtil ,我直接在根目录创建一个 MyStringUtil 文件夹就放了不行?腾讯的 StringUtil ,就叫做 TencentStringUtil ,都放到根目录,就一层文件夹。简单又清爽。为什么要嵌套 com/xxx/yyy/zzz/mmm/tmd/fuck/shit/mmm/StringUtil?
]
哈哈哈哈,果然什么都不懂,你能控制别人的 jar 包 里的类是怎么命名的吗? 你确实可以自己建一个 MyStringUtil ,但是如果别人引入了你的 jar 包, 但是他不知道你有 MyStringUtil ,自己又建一个 是不是冲突了? ok ,你可以说 发现冲突了可以改,那我问你,如果你引入的两个 jar 包 类名冲突了咋办? 你去翻他们的源码,修改 然后重新编译吗???

语言特性 哪里笨重?? 请具体说明,

部署麻烦:一个 jar 包往服务器一丢,就可以启动了这也麻烦? 你家的 go 是 自动编译,自动部署,不需要 往服务器丢东西吗???

生态环境:我也是笑了,新生代语言 谁敢跟 java 比生态???
Joker123456789
   87
Joker123456789  
   2022 年 5 月 11 日   ❤️ 2
@zakokun 请你先好好学学 java 再来说好吗? 你但凡专业一点也不至于这样吧? 包名 在 代码编辑器里面 居然可以显示成目录,你是多么的不专业,发出来简直贻笑大方。

src/main/java 这是 maven 的目录,不需要你手写。后面的全是包名,你但凡专业一点,这些包名 都不至于显示成目录。

自己菜 就别出来丢人了!
tf2
   88
tf2  
   2022 年 5 月 11 日   ❤️ 1
世界名画两张





Joker123456789
   89
Joker123456789  
   2022 年 5 月 11 日   ❤️ 1
@Buges 你好好学学 java 再说吧,src/main/java 是 maven 的目录,你不用 maven 就没了,而且这一层不需要手写。

com/example/Xxx.java, 我上面已经解释过了, 你如果真想喷这一点,可以再去细细了解一下好吧? 而且 go 的 import 后面 不也很长?甚至更长,只不过他不是用目录来 解决这个问题罢了。

而且这都不是问题,往代码编辑器里一丢( idea ,eclipse 等), 根本就不会显示出很多层。 我也用过 go ,还开发过两个框架,对比下来没觉得 go 哪里简洁了。

而且从你的喷法来说,java 也就这个目录 能吐槽吐槽了吧,哈哈哈哈。
Joker123456789
   90
Joker123456789  
   2022 年 5 月 11 日
@mekingname 对了,还有一点,这也是规范罢了,你不想遵守,只想编码一时爽,完全没问题,抛弃规范好了,用你家的 go 规范。

包名完全可以一层啊,甚至都不需要包名,直接在 src 目录下建类,又不是不可以,又不是编译不通过,又不是运行不起来。

你觉得 get/set 麻烦,可以学 go 啊,全部定义成 public 不觉解决了??
wiix
   91
wiix  
   2022 年 5 月 11 日   ❤️ 2
@zakokun
正经的显示方式是这样的

喷 Java 的但凡能用 eclipse 或 idea 打开一下也不会这么招人烦。
Joker123456789
   92
Joker123456789  
   2022 年 5 月 11 日   ❤️ 1
@Buges 还有一点,这也是规范罢了,你不想遵守,只想编码一时爽,完全没问题,抛弃规范好了,用 go 规范。

包名完全可以一层啊,甚至都不需要包名,直接在 src 目录下建类,又不是不可以,又不是编译不通过,又不是运行不起来。

你觉得 get/set 麻烦,可以学 go 啊,全部定义成 public 不就解决了??

还有个问题,你的原话是 [我只在乎我用的 StringUtils 是项目中导入的哪个库里的] 。

你去看看 别的语言,怎么解决这个问题的,是怎么让你区分导入的哪个库里的,有几个短的?
Joker123456789
   93
Joker123456789  
   2022 年 5 月 11 日   ❤️ 1
@lambdaq 麻烦你专业一点好吗? 发这种图 就是暴露自己水平的。 你先想清楚 我为什么说你不专业,再回复我。
Joker123456789
   94
Joker123456789  
   2022 年 5 月 11 日   ❤️ 1
@mekingname 我还想吐槽一下你家的 go ,你说 java 部署麻烦, 不就是比你家的 go 多了一步吗?服务器装 jdk ,就这么一步而已,有多麻烦?

你家的 go 还不跨平台呢,你的开发环境如果是 windows ,服务器是 linux ,你试一下部署麻不麻烦? 你要在 windows 上配多少东西 才能编译出 去 linux 上运行的二进制文件?? 如果你不在本地编译,那你的服务器上不也要装 go 编译器??

半斤八两罢了!!

你千万别扯 自动化部署,docker 等东西,这些东西 java 也是完美支持的。
yedanten
   95
yedanten  
   2022 年 5 月 11 日 via Android   ❤️ 3
难道不是因为这玩意太傻逼了,IDE 为了好看才这么显示么
oldshensheep
   96
oldshensheep  
   2022 年 5 月 11 日   ❤️ 3
为什么那么多人吐槽文件夹多,文件名长的……你们都是用记事本写代码的吗?
nba2k9
   97
nba2k9  
   2022 年 5 月 11 日
@oldshensheep 可能都是在资源管理器一个个新建文件夹写代码的吧
limyel
   98
limyel  
   2022 年 5 月 11 日
使用现代化的 IDE 开发可能就没这么多事情了吧
yazinnnn
   99
yazinnnn  
   2022 年 5 月 11 日   ❤️ 1
jvav 喷点那么多,抓着包名喷不会显着很傻逼吗?
plutome
   100
plutome  
   2022 年 5 月 11 日   ❤️ 1
@Joker123456789

不参与对 java 的争辩。
更正一个信息,使用 go 在 windows 上不需要做任何配置即可编译 linux 上运行的二进制文件。

go env -w GOOS=linux

ps: 你是不是一行 go 都没写过呀
第 1 页
共 2 页
12
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 269ms · 3.9.8.5