把 Java 写成动态语言了,越改越崩溃。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hahaFck
V2EX    Java

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

  •  
  •   hahaFck 2021-08-23 14:29:12 +08:00 4739 次点击
    这是一个创建于 1510 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各种 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     Solana     2667 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 03:24 PVG 11:24 LAX 20:24 JFK 23:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86