关于 Java 很重有感

2022 年 5 月 10 日
 Bingchunmoli
  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 有的人不带的。没有对错之分。
16882 次点击
所在节点    程序员
142 条回复
sun1991
2022 年 5 月 11 日
奇怪为什么没人提一出错就是上百层的 stacktrace?
zakokun
2022 年 5 月 11 日
我一条条看了回复,主要是如下几类:
java 是干大事的语言,所以文件夹多是应该的;
你就是羡慕嫉妒恨,拉仇恨的;
go 是垃圾语言;
做前端的都是垃圾;
你应该去研究研究 XX 技术就懂了;
java 是领导者,其他语言都在 battle 它;
楼主闲的蛋疼;
你是不是傻逼居然不会建文件夹;
别的东西比 java 重多了,你怎么不说其他东西;
楼主没做过大工程,没经验;

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




不可笑吗?一层层的全是单文件夹没其他东西,idea 甚至有合并文件夹路径功能,它扫描到你全是单文件夹就直接定位到最深的一层文件夹,也是一大亮点了。
Bingchunmoli
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
2022 年 5 月 11 日
我也挺好奇为什么 java 项目的文件夹为什么这么深,我写 C#项目很少超过 3 层,写 java 的时候看见别人套了好多层,我就照着也套很多层...
userforg2021
2022 年 5 月 11 日
@zakokun 哈哈哈,血压上来了。之前看一个开源项目。八九层源码文件夹点开,里面两个文件。再看测试,也是八九层文件夹,点开就一个文件,还是占位的。当场就跪了。
Joker123456789
2022 年 5 月 11 日
@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
2022 年 5 月 11 日
@zakokun 请你先好好学学 java 再来说好吗? 你但凡专业一点也不至于这样吧? 包名 在 代码编辑器里面 居然可以显示成目录,你是多么的不专业,发出来简直贻笑大方。

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

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





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

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

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

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

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

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

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

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

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

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

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

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

半斤八两罢了!!

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

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

go env -w GOOS=linux

ps: 你是不是一行 go 都没写过呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/851925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX