V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jqsl2012
V2EX  ›  程序员

如何把一段简单的代码变复杂?

  •  
  •   jqsl2012 · 2022-04-08 15:44:13 +08:00 · 3179 次点击
    这是一个创建于 739 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这问题你应该去问企业级 Java 架构师。

    就比如 print 一句 hello world 吧。main 函数里 print 一下?太面向过程,太 low 了。

    得封装一个类。叫 Printer. Printer 有个成员方法,叫 print 。

    但是!光一个类太 low 了,以后要是有不同的实现怎么办?所以得加一个接口。PrinterInterface 。

    但是! interface 是没有实现的,还是要有默认实现才行。所以得加个虚拟类,AbstractPrinter 实现 PrinterInterface ,然后 Printer 继承 AbstractPrinter 。

    但是!你有了那么一套,该怎么创建实例呢?直接 new Printer()?太 low 了,那叫实现依赖。肯定不行的,所以要搞一个工厂类,PrinterFactory ,PrinterFactory 用 PrinterInterface 返回实例,这样就隐藏了实现细节了。

    但是! PrinterFactory 本身也是实现类啊,太 low 了,所以得有 PrinterFactoryInterface, AbstractPrinterFactory.

    而且在 PrinterFactory 里面该怎么写呢?直接 new Printer()? 太 low 了。还是实现依赖。

    最后,你要把这一堆玩意在代码里组装起来,也太难看了,各种 new 实现类。太 low !

    好在我们有个高级玩意,叫依赖注入!把程序对象结构全写到配置文件里面。这一套当然是不能自己造轮子的。配置 Spring 吧。搞了那么多 lib ,靠命令行或者 IDE 的项目管理肯定不够啊,得有依赖管理。Maven 啊 Gradle 啊使劲上。

    最最后,要 print 的东西怎么传给程序呢?硬编码?命令行传参数?太 low !当然得写在 XML 里头。

    光是 XML 当然还不够企业级,再加上 DTD 验证吧。

    然后就涉及到了 XML 解析的问题了。代码里直接操起 parser 吗?太 low! 当然要写个 parser 的包装类,interface, abstract class, implementation class, factory class 再来一套。毕竟,不能依赖实现啊,以后我要是换 parser 了怎么办。

    所以最后是成品是一堆配置文件,一堆 jar ,compile 出来的程序 200MB 。

    IDE 得装上 300 个插件,打开项目硬盘响老半天吃掉 2GB 内存,然后一堆插件弹提示要求升级。

    哦对了,在这一切发生之前,还得画 UML 图呢。

    三年后项目完工了,部署到客户的服务器上一跑,立马崩溃,一地的 stack trace 。原来客户服务器上用的是 JDK 5 而新项目需要 JDK 6. 然后问客户你们不能升级吗,答案是不行,因为另外一个企业级开发组给做的企业级解决方案只支持 JDK 5 。接着客户把你们的架构师臭骂了一顿,你搞了那么多设计就没有想过可能会换 JDK 吗?

    21 条回复    2022-04-10 18:11:41 +08:00
    Leviathann
        1
    Leviathann  
       2022-04-08 15:47:42 +08:00
    所以 new 关键字人嫌狗憎实锤了,难怪现在很多语言都不用 new
    xujinkai
        2
    xujinkai  
       2022-04-08 16:00:25 +08:00   ❤️ 5
    好奇就去搜了一下,给你配段代码

    他这个名字叫 Hello World Enterprise Edition ,很形象了

    https://gist.github.com/lolzballs/2152bc0f31ee0286b722
    DOLLOR
        3
    DOLLOR  
       2022-04-08 16:05:05 +08:00
    ❌helloWorld
    ⭕hellWorld
    paradoxs
        4
    paradoxs  
       2022-04-08 16:05:49 +08:00
    反正我没见过哪个客户会关心 JDK 版本的

    态度都是:能干就来,不能干就滚,换人。
    Macolor21
        5
    Macolor21  
       2022-04-08 16:06:35 +08:00
    懂了,这就把我的 gof design patterns 丢掉
    xuanbg
        6
    xuanbg  
       2022-04-08 16:10:09 +08:00
    自己实现一个 print 来输出 hello world……
    66450146
        7
    66450146  
       2022-04-08 17:26:53 +08:00
    Rache1
        8
    Rache1  
       2022-04-08 17:28:02 +08:00
    早上才在知乎看到,虽然很多年前已经看到过 😂
    v2byy
        9
    v2byy  
       2022-04-08 18:06:56 +08:00
    咦,现在不是快速迭代吗
    Tanix2
        10
    Tanix2  
       2022-04-08 18:15:07 +08:00
    别抄啦,整点原创的行不
    xujinkai
        11
    xujinkai  
       2022-04-08 18:15:50 +08:00
    thedrwu
        12
    thedrwu  
       2022-04-08 18:18:20 +08:00 via Android
    @xujinkai #2 没有 Test ,不够 Enterprise
    waterlaw
        13
    waterlaw  
       2022-04-08 18:30:34 +08:00 via Android   ❤️ 1
    DO 14 I=1,N
    DO 14 J=1,N
    14 V(I,J)=(I/J)*(J/I)
    若你不是 Fortran 程序员,请听我解释。这段代码包括了两个嵌套的 DO 循环,这两个循环都在第 14 行结束。循环控制的索引变量从最低限步进到最高限,所以外循环 I 从 1 步进到 N ,内循环 J 也从 1 步进到 N 。变量 V 是个 N 行 N 列的数组; I 遍历每一行,在每一行中,J 遍历每一列。
    这两个循环创建了一个 N×N 的矩阵,对角线上是 1 ,其他地方都是 0 ,当 N 等于 5 时就像下面这样:
    1 0 0 0 0
    0 1 0 0 0
    0 0 1 0 0
    0 0 0 1 0
    0 0 0 0 1
    在做整数除法时,Fortran 会丢弃结果的小数部分,故若 I 不等于 J ,除法结果为 0 ;若 I 等于 J (在对角线上),结果就是 1 。
    jqsl2012
        14
    jqsl2012  
    OP
       2022-04-08 22:15:17 +08:00
    @Tanix2 为什么金大侠的剧本要翻拍?好玩的东西有时候很多人并没看过,让他们一起乐乐有啥问题吗
    Chowe
        15
    Chowe  
       2022-04-08 22:35:11 +08:00 via iPhone
    请参考 ioccc
    Kininaru
        16
    Kininaru  
       2022-04-09 09:19:06 +08:00 via iPhone
    看完之后更加坚定了我以后不写代码为生的想法
    Tanix2
        17
    Tanix2  
       2022-04-09 14:00:49 +08:00
    @jqsl2012 你转载也不标明出处,还这么理直气壮,翻拍难道不交版权费吗
    jqsl2012
        18
    jqsl2012  
    OP
       2022-04-09 15:24:53 +08:00 via Android
    @Tanix2 你这句话也是转载的请问你标明了出处?交了版权费吗?
    Tanix2
        19
    Tanix2  
       2022-04-09 22:41:15 +08:00
    @jqsl2012 不知道什么叫版权?
    Kasumi20
        20
    Kasumi20  
       2022-04-09 23:58:05 +08:00
    不用管内存的程序员就是这么矫情
    zlowly
        21
    zlowly  
       2022-04-10 18:11:41 +08:00
    最后那一段不是很明白,如果你早知道是要和另外一个项目集成的话,这不是前期就要沟通联调的吗?
    如果两者只是共存在一个服务器上互不影响,那 jdk 多版本并存应该也没啥问题,也就是环境变量配一下而已,哪来什么升级问题?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3285 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 13:42 · PVG 21:42 · LAX 06:42 · JFK 09:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.