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

关于 Java 很重有感

  •  
  •   Bingchunmoli · 2022-05-10 11:20:45 +08:00 · 14098 次点击
    这是一个创建于 963 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
    codefever
        1
    codefever  
       2022-05-10 11:26:49 +08:00
    历史包袱太重,存在不少过度设计,没有从头来过的勇气只能继续堆砌,但是新版本+甩掉包袱还是可以比较轻的
    libook
        2
    libook  
       2022-05-10 11:28:55 +08:00
    基本都是人为因素,语言提供了灵活性,有没有选择最佳方案去运用就是个人能力的问题。
    而且一个项目之所以成为了现在的样子,肯定是因为这个项目的整个发展历史,那么只从当前状态去评价一个项目就不大客观了,因为很多时候是因为历史原因导致现在是现在这个样子。
    TWorldIsNButThis
        3
    TWorldIsNButThis  
       2022-05-10 11:29:52 +08:00 via iPhone   ❤️ 15
    java 的蠢点在于
    很多人刻意建几层 reverse domain name 的文件夹
    什么 com / example / xxx
    一股浓烈的裹脚布的臭气

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

    3. 线程模型啥的……一来基本没得选,二来广大一般程序员也驾驭不住太复杂的模型,简单好用才是真,出了问题解决不了对公司和客户都不好
    lujiaosama
        11
    lujiaosama  
       2022-05-10 12:31:54 +08:00
    前端不是过度封装很难写出一层又一层的结构目录.
    Bingchunmoli
        12
    Bingchunmoli  
    OP
       2022-05-10 12:39:12 +08:00
    @TWorldIsNButThis 没有框架之前都是 com 包一把梭,后来因为 spring 要扫包,就开始 com.域名了,不过除了开源的项目,公司项目完全可以,com.公司域名,一把梭,没必要再跟.项目名.** 什么的分下去
    Bingchunmoli
        13
    Bingchunmoli  
    OP
       2022-05-10 12:42:48 +08:00
    @statumer 作为入门新手,threadlocal 和 tomcat 的并发模型 没怎么用过 听说 tomcat 也已经 nio 了 这不是已经是最好的了。 JDBC 性能好像没什么人提 不清楚,难道是 druid 的问题吗。
    Bingchunmoli
        14
    Bingchunmoli  
    OP
       2022-05-10 12:43:49 +08:00
    @codefever 包袱确实很重,Date 不推荐但仍然在用,Random 、JSP 仍然在教
    Bingchunmoli
        15
    Bingchunmoli  
    OP
       2022-05-10 12:45:01 +08:00
    @libook 是的,之前的公司就是一直堆需求,每次都是能上线没白屏(to C)就是万世大吉, 没有事务,堆同一个服务,堆代码
    libook
        16
    libook  
       2022-05-10 12:49:59 +08:00   ❤️ 1
    @Bingchunmoli #14 比较有经验的架构师会在提出一个技术方案的同时提出配套的重构方案,如果重构方案延后实施就是技术债务,有良好还债节奏的项目不会越来越糟糕。
    statumer
        17
    statumer  
       2022-05-10 13:02:18 +08:00
    @Bingchunmoli tomcat 的并发模型是让每个线程负责一个请求-响应流程,真正的高性能架构每个线程可以同时处理上千个请求-响应流程。去了解一下 reactor 吧。
    byte10
        18
    byte10  
       2022-05-10 13:07:09 +08:00
    @Bingchunmoli 你都没有理解#5 楼的话。。。建议你看看那个 B 站《 NIO 绝对优势》: https://www.bilibili.com/video/BV1FS4y1o7QB ,你才知道啥是 NIO ,才明白 5 楼表达的 JDBC 同步阻塞问题。tomcat NIO 提升吞吐量很有限,因为底层就是 JDBC 就是同步阻塞的。 但是没有几年的经验可能看不懂,可以多看几遍。
    billlee
        19
    billlee  
       2022-05-10 13:15:46 +08:00 via Android
    @byte10 JDBC 同步阻塞真的是关键问题吗,毕竟数据库那边也是同步阻塞的
    Bingchunmoli
        20
    Bingchunmoli  
    OP
       2022-05-10 13:17:46 +08:00 via Android
    @byte10 ok ,io 这块不太熟。
    dcsuibian
        21
    dcsuibian  
       2022-05-10 13:26:28 +08:00
    换语言对于”历史包袱“指标不治本,就是下一次轮回而已
    2NUT
        22
    2NUT  
       2022-05-10 13:39:24 +08:00
    @wolfie #4 别的语言为什么没采用这种方式呢?
    pengtdyd
        23
    pengtdyd  
       2022-05-10 13:42:06 +08:00
    为啥没人说 C 很重呢?
    cheng6563
        24
    cheng6563  
       2022-05-10 13:57:56 +08:00
    @statumer Java 又没协程,把 servlet 和 jdbc 丢掉又有什么用?常规的 curd 业务代码换用 vert.x 那套来写不得花 3 倍时间?
    Chinsung
        25
    Chinsung  
       2022-05-10 14:00:01 +08:00
    @billlee #19 叕叕叕看到有人吹 NIO 了,NIO 固然厉害,但是建议楼主了解 NIO 原理和 netty 就行了,至于说 JDBC 因为同步阻塞不用的更是有点牛,大部分复杂点的业务都是要大量 sql 的,你不会把依赖上下文的 sql 写回调里或者手动 block 吧,不会有人喜欢这么写业务逻辑吧,不会吧不会吧。spring 自己都推不动 spring boy 用 spring reactive ,咋办呢?
    Vegetable
        26
    Vegetable  
       2022-05-10 14:06:24 +08:00   ❤️ 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-05-10 14:06:35 +08:00 via iPhone
    @cheng6563 Java 提供不了这样的基础设施,Spring Boy 整不明白异步编程,综合起来可不就构成了 Java 性能差劲的印象么?
    BeautifulSoap
        28
    BeautifulSoap  
       2022-05-10 14:16:01 +08:00
    最近学 Kotlin ,当我知道 Java 一个文件里只能定义一个公开类的时候,我是震惊的
    dcsuibian
        29
    dcsuibian  
       2022-05-10 14:19:20 +08:00   ❤️ 20
    @pengtdyd 我之前也有这个疑问:Java 天天人人喊打,但 JavaScript 、C 、C++就没什么人提。
    后来想明白了,js 之于浏览器、C 之于嵌入式、C++之于游戏基本上都是不可替代的(就是打不过),但 Java 之于后端不是。新出的语言又大多是上层的,是个语言都能写后端。因此人人都想 battle 一下。
    但这么多年都没打下来,说白了就是 Java 确实好用罢了。
    byte10
        30
    byte10  
       2022-05-10 14:22:30 +08:00
    @billlee JDBC 同步阻塞是真的问题,会导致 NIO 无法被真正使用上来。如果想理解为何,可以看看我的那个教程。我的那个教程有一个 Nodejs 写的服务,如果你用 java 传统的同步阻塞去调用,那么性能很慢,用异步去调用就快很多了。我的那个视频讲解有讲为何 NIO 能做到无视 IO 时间,依然保持高水平的吞吐量。你也可以请教一下评论区的其他网友, 他们也是懂的。
    Mohanson
        31
    Mohanson  
       2022-05-10 14:24:29 +08:00   ❤️ 5
    本质是 OOP 的问题.

    "以 OOP 设计为导向的语言的问题是每个变量都随身携带着全部隐含环境. 您想要一个香蕉, 但您得到的是一只拿着香蕉的猩猩, 甚至它背后的整个丛林." - Erlang 创造者 Joe Armstrong
    nekoneko
        32
    nekoneko  
       2022-05-10 15:18:39 +08:00   ❤️ 1
    @statumer #27 你说的这些跟 java 有什么关系呢, 异步编程 quarkus 就主打异步编程呀, spring 又有异步编程组件呀, reactor 跟语言又有什么关系呢? 是 java 没法实现 reactor 还是 java 没法实现 nio 了呢
    billlee
        33
    billlee  
       2022-05-10 15:23:27 +08:00 via Android
    @byte10 我觉得那个视频说的很对,我也认同阻塞会导致 NIO 失效。但 JDBC 是连接数据库的,数据库服务端还是同步阻塞线程模型啊,我们就算实现一个异步的数据库客户端,那还是大家一起在数据库服务器的线程池上排队。
    lizhesystem
        34
    lizhesystem  
       2022-05-10 15:32:09 +08:00
    怎么天天有人讨论这种问题?
    statumer
        35
    statumer  
       2022-05-10 15:37:32 +08:00
    @nekoneko 我说的是 Spring Boy 没资格说 Java 不重,而不是 Java 本身很差。实际上 Java 性能很强,HotSpot JVM 的优化在 GC 语言里是顶尖水平,techempower 打榜日常前十。拜托先看明白我在说什么。
    liy333
        36
    liy333  
       2022-05-10 15:50:21 +08:00 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-05-10 16:08:07 +08:00 via iPhone
    @cheng6563 好消息,Java 支持纤程了

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

    现在已经 preview 了
    heeeeeem
        38
    heeeeeem  
       2022-05-10 16:08:39 +08:00
    @TWorldIsNButThis 啊 这不是人蠢吗?你嘴巴吃布了吧
    Chinsung
        39
    Chinsung  
       2022-05-10 16:25:35 +08:00
    @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-05-10 16:45:41 +08:00
    @billlee 额,你不能这样的分析哦,你分析问题要看整体。至于 mysql 里面是怎么运行,你只要需要知道 mysql 能到多少的吞吐量就可以了,你要把 mysql 考虑成一个整体,它吞吐量是多少就说明 java 最大的吞吐量上限是多少。。。。关于”那还是大家一起在数据库服务器的线程池上排队“, 这个排队在 mysql 服务里面,对于客户端无所谓,客户端完全不关心你啥时候返回,客户端可以等 1 分钟都可以等得起。

    换句话说,如果没有 JDBC-NIO 客户端,那么 Java 的 NIO 服务就无法用起来了,多线程依然会存在 java 服务中,如果 NIO 客户端,那么 java 就不用关注多线程了,它不需要考虑 mysql 的响应时间来调整线程数。不过 NIO 需要考虑背压,不然无脑的请求下游服务会出问题。
    statumer
        41
    statumer  
       2022-05-10 17:04:54 +08:00 via iPhone   ❤️ 2
    @Chinsung
    你是怎么做到 JVM 的性能和 Spring 的性能都能混淆的?
    是不是在你的心目中 Spring 就是唯一的、不可亵渎的神?
    我忏悔,我侮辱了 Java 世界的 One True God🤣
    建议 Kafka 用 Spring 重构,自己封装 Java NIO 用 reactor 太落后了。
    zmal
        42
    zmal  
       2022-05-10 17:21:45 +08:00
    op 最好从一个具体的场景或问题出发,不然这个问题无法讨论。
    Chinsung
        43
    Chinsung  
       2022-05-10 17:21:55 +08:00   ❤️ 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-05-10 17:55:12 +08:00   ❤️ 2
    @TWorldIsNButThis 不懂极少说几句好吧,java 的包名是为了 让类名唯一 才这么要求的。

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

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

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

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

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

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

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

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

    @TWorldIsNButThis

    会有重复类名 真正的问题在于 java 并没有 import as 导致你要写完整包路径
    mekingname
        49
    mekingname  
       2022-05-10 19:31:20 +08:00   ❤️ 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-05-10 19:54:53 +08:00   ❤️ 2
    @mekingname ummm 你的理由我认同,但我觉得你的例子不太妥当。

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

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

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

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

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

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

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

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

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




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

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

    自己菜 就别出来丢人了!
    lambdaq
        88
    lambdaq  
       2022-05-11 16:20:33 +08:00   ❤️ 1
    世界名画两张





    Joker123456789
        89
    Joker123456789  
       2022-05-11 16:20:51 +08:00   ❤️ 1
    @Buges 你好好学学 java 再说吧,src/main/java 是 maven 的目录,你不用 maven 就没了,而且这一层不需要手写。

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

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

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

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

    你觉得 get/set 麻烦,可以学 go 啊,全部定义成 public 不觉解决了??
    wiix
        91
    wiix  
       2022-05-11 16:29:36 +08:00   ❤️ 2
    @zakokun
    正经的显示方式是这样的

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

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

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

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

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

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

    半斤八两罢了!!

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

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

    go env -w GOOS=linux

    ps: 你是不是一行 go 都没写过呀
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2552 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:25 · PVG 12:25 · LAX 20:25 · JFK 23:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.