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

把 Java 写成动态语言了,越改越崩溃。

  •  
  •   hahaFck · 2021-08-23 14:29:12 +08:00 · 4201 次点击
    这是一个创建于 1219 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各种 map,前台数据传到后台转换成 map 或者 list<Map>,数据库查询返回 list<Map>,方法调用传参数也是 Map,现在改个东西,完全不知道会影响到哪里,因为都是 Map 参数,方法签名一般都不变,但是 Map 里面的数据不仔细看根本不读知道都有什么,真是越改越崩溃。
    另外 map 取数也是各种类型转换,各种 null 判断。
    及其 ugly 的代码。
    第 1 条附言  ·  2021-08-25 09:48:38 +08:00
    真是动态一时爽,维护火葬场。不知道其他语言开发比如 go,c++等也有这个问题么。
    39 条回复    2021-09-26 17:52:25 +08:00
    qaz168000
        1
    qaz168000  
       2021-08-23 15:15:10 +08:00
    不是做 java 的,但是感觉这其实也是一种趋势,数据结构和内容其实也只有输入端和接收端才会关心,最多也就加个 filter 会关注
    ztcaoll222
        2
    ztcaoll222  
       2021-08-23 16:05:21 +08:00
    那么问题来了,一开始为什么要这么做
    Chaitanya
        3
    Chaitanya  
       2021-08-23 16:34:41 +08:00   ❤️ 1
    开发一时爽,维护火葬场
    thtznet
        4
    thtznet  
       2021-08-23 16:54:59 +08:00
    动态一时爽...
    egfegdfr
        5
    egfegdfr  
       2021-08-23 17:04:52 +08:00
    我们隔壁组也这么些,有几次和他们一次查问题,查到奔溃。所以 自己这边严格控制 map 的使用(具体看业务情况),看到不合理的 会让大家改了。 这个还是看第一版的开发人员习惯吧
    liaojl
        6
    liaojl  
       2021-08-23 19:14:02 +08:00 via iPhone   ❤️ 1
    我们组也是一样,入参各种 map,出参一律 object,有时想知道这个 return 的 object 是什么类型的,跟到代码里面才发现,其实也是一个 map,崩溃...
    golangLover
        7
    golangLover  
       2021-08-23 23:05:21 +08:00 via Android
    一开始就不允许这样写啊。。。
    wangsongyan
        8
    wangsongyan  
       2021-08-23 23:33:30 +08:00
    之前帮其他项目组救急接触过类似的代码,mybatis 参数、返回值全是 Map,我滴个乖乖,现在还有阴影
    q447643445
        9
    q447643445  
       2021-08-24 02:22:38 +08:00
    现在代码都生成还有这问题?
    msg7086
        10
    msg7086  
       2021-08-24 06:17:55 +08:00
    我甚至开始怀疑是不是 Java 圈子里就流行这么做。
    手里拿到的组里的代码也是,组件之间全都是 Map<String,String>传参……
    实在不知道为什么不做一个静态类型 POJO 的输入。
    kingfalse
        11
    kingfalse  
       2021-08-24 07:34:44 +08:00 via Android
    现在还是不能在少定义一些 bean 的方面有什么好的解决办法
    bthulu
        12
    bthulu  
       2021-08-24 08:48:08 +08:00
    这是 mybatis 带的好头
    xjlnjut730
        13
    xjlnjut730  
       2021-08-24 08:57:12 +08:00
    不允许用 Map 做出入参就可以了。
    我反正项目里从来不用,多定义点 Bean,我觉得都比 Map 好太多。维护性完全不是一个级别的。
    shellic
        14
    shellic  
       2021-08-24 09:10:09 +08:00
    可能是为了赶工期吧,毕竟老板觉得这个也简单那个也简单,所以小公司小老板用 PHP 这种语言是最合适的
    XieQing0428
        15
    XieQing0428  
       2021-08-24 09:28:34 +08:00
    之前问了下说是开发灵活..
    darrenfang
        16
    darrenfang  
       2021-08-24 09:49:41 +08:00
    之前维护的一个 10 多年前的项目就是这样的
    aeiou520
        17
    aeiou520  
       2021-08-24 10:08:02 +08:00
    这个算好..我遇到过,用查库用 jdbc,没有 bean,全 map,接口可以在后台配置,代码存数据库,动态调用.维护怕了
    zhangxh1023
        18
    zhangxh1023  
       2021-08-24 11:31:35 +08:00
    各种 JSONObject 满天飞的表示也差不多这种感觉。。。
    James369
        19
    James369  
       2021-08-24 11:45:59 +08:00
    javascript 不经常这么做么,java 不是 javascript 的缩写么
    seakingii
        20
    seakingii  
       2021-08-24 12:25:47 +08:00
    可以这么做,也可不这么做,那么问题来了,为什么一定要用 MAP 传参?
    cslive
        21
    cslive  
       2021-08-24 12:33:22 +08:00
    居然真的有这么干的!!!!
    NoDocCat
        22
    NoDocCat  
       2021-08-24 14:56:37 +08:00
    @James369 然而, 人家可以上 TS 做 map 的泛型
    unco020511
        23
    unco020511  
       2021-08-24 15:54:42 +08:00
    之前维护过一个类似的项目,一度有了离职的想法
    aneostart173
        24
    aneostart173  
       2021-08-24 16:51:09 +08:00
    你抛弃了编译器,编译器就抛弃了你。
    ccde8259
        25
    ccde8259  
       2021-08-24 18:43:14 +08:00 via iPhone
    前一家一样的问题,二次开发全靠 Debug 看数据。
    更可怕的是那些 void func(Map<?,?> map)方法,纯副作用函数……
    122006
        26
    122006  
       2021-08-24 20:24:38 +08:00
    偷个懒直接拿到就 jsonobject 转为实际量就算了,在后续逻辑过程中解析的直接火葬场
    kaneg
        27
    kaneg  
       2021-08-24 22:09:12 +08:00
    所以,很多人为了所谓的灵活,并且懒得定义 bean class,结果自己一时爽,😭了后来人。
    tedzhou1221
        28
    tedzhou1221  
       2021-08-25 09:08:43 +08:00
    我都怀疑你是我同事。哈哈
    securityCoding
        29
    securityCoding  
       2021-08-25 09:26:02 +08:00
    @bthulu 严格来说是 jdbc 搞出来的玩意
    luzemin
        30
    luzemin  
       2021-08-25 10:13:26 +08:00
    面向对象的语言不面向对象编程,就是原罪
    cco
        31
    cco  
       2021-08-25 10:59:57 +08:00
    看场景吧,因为我们的查询来源五花八门,字段也是非常的多,所以 前台 - > 接口 <- DB 都是使用 Map 传参,返回 List<Map>,恶心吗?的确恶心,但是这应该是目前开发场景的最优解。如果把这些都用对象替代,那么光定义对象就得一大堆,并不比 Map 好用。
    a719031256
        32
    a719031256  
       2021-08-25 11:50:45 +08:00
    老代码?

    以前遇到过这种情况,那个项目据说是一个人写后端,web 端,安卓端,外加时间短才导致代码很烂
    nanmu42
        33
    nanmu42  
       2021-08-27 12:53:59 +08:00
    我一般写 Go,最近有些 Flink 需求学着写一些 Java,感觉是不是因为 Java 里不习惯把 struct(class)当成纯粹的数据载体?以及 Java 里定义 class 比较麻烦?

    Go 里如果数据结构是确定好的话,一般是从 JSON 直接解析到 struct (对应 Java 的 POJO ),字段和类型都是固定的,而且 struct 定义比较方便,一般没有这个烦恼。
    hahaFck
        34
    hahaFck  
    OP
       2021-08-27 13:16:26 +08:00
    @nanmu42 是,java 没有 struct,建一个类相比其他语言感觉成本高。
    liian2019
        35
    liian2019  
       2021-08-27 18:02:33 +08:00
    维护起来不得哭了 方法入参是啥都不知道
    issakchill
        36
    issakchill  
       2021-08-30 13:02:09 +08:00
    曾经在一家银行维护过这样的代码 一个月就跑路了
    hahaFck
        37
    hahaFck  
    OP
       2021-08-30 13:05:25 +08:00
    @issakchill 很难想象,银行都写这样的代码。
    seliote
        38
    seliote  
       2021-09-05 20:52:11 +08:00
    组里也有人这么干,一开始还想管,后面已经懒得管了,不通读代码根本不知道写的是什么玩意
    night98
        39
    night98  
       2021-09-26 17:52:25 +08:00
    强制规范不允许使用 map 作为入参和出参啊

    动态语言是动态语言的玩法,静态语言是静态语言的玩法,非要强行融合那必然死的很惨

    map 仅适用于参数不固定,例如上下文传递这种,或者是模板入参必须 map,其他场景都是可以用强类型替代的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:40 · PVG 12:40 · LAX 20:40 · JFK 23:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.