Java 开发新手,请教一个在进行业务代码开发时遇到的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vegetablefriend
V2EX    Java

Java 开发新手,请教一个在进行业务代码开发时遇到的问题

  •  
  •   vegetablefriend 2024-04-30 12:04:28 +08:00 2981 次点击
    这是一个创建于 560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Excel 解析,需要处理每个单元格,并把解析出有问题的单元格汇总起来导出,如果都没有问题继续执行流程

    遂设计函数如下:

    public Object parse(Cell cell) { if (wrongFormat(cell)) { reutrn nll; } return getContent(cell); } 

    但是后面发现需要把「具体的错误格式信息」也导出出来,这样我就想到了下面两种设计:

    public class Response { String errorMessage; Object parseResult; } public Response parse(Cell cell) { if (wrongFormat(cell)) { return response; } return response; } 

    public Object parse(Cell cell) { if (wrongFormat(cell)) { throw new Exception("wrong info"); } return getContent(cell); } 

    纠结第一种的原因:总感觉这种应用内的,不涉及前端调用和其他微服务交互的函数,返回这种 Response 不够简洁

    纠结第二种的原因:这种纯格式的校验(判空、单元格类型)等,是否适合用抛出异常的方式控制流程?

    不知道该如何选择,场景是后台场景批量导入,并发量应该比较低

    15 条回复    2024-05-01 23:02:54 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2024-04-30 12:37:32 +08:00   4
    建议,直接报错即可。在最外层统一拦截,,,

    至于报错展示一个,还是展示所有。。。可以实际情况而定。
    NotFoundEgg
        2
    NotFoundEgg  
       2024-04-30 12:43:53 +08:00   1
    定义一个业务异常类,外部只 catch 这个类型做处理
    crudbychang
        3
    crudbychang  
       2024-04-30 13:40:11 +08:00   1
    可以考虑把错误信息用标记再批注写回,用 EasyExcel 可以很容易做
    vivisidea
        4
    vivisidea  
       2024-04-30 14:12:25 +08:00   1
    ```
    public class Response {
    // enum errorType;
    String errorMessage;
    Object parseResult;
    }
    ```

    建议是第一种,增加一个 enum errorType ,便于上层分类处理,要不然要直接处理字符串

    这个是 wrongFormat 里面能预见的 error ,不应该由异常来封装,exception 留给真正的异常( npe 这种)
    yidinghe
        5
    yidinghe  
       2024-04-30 14:22:27 +08:00
    首先,你要的是汇总,所以是不是要等全部单元格检查完了,再输出汇总结果?而不是遇到一个错误,就立刻抛出异常中止检查?

    其次,你的汇总结果当中要包含什么有价值的信息?是否要包含单元格的位置,单元格的内容,以及为什么有问题?所以你的 Response 里面是不是应该有一个 List ?
    vegetablefriend
        6
    vegetablefriend  
    OP
       2024-04-30 14:48:10 +08:00
    vegetablefriend
        7
    vegetablefriend  
    OP
       2024-04-30 14:50:58 +08:00
    @yidinghe

    1. 是的 所以需要对每个检查单元格内容方法,都环绕 try-catch 处理(个人认为比较蠢,但可以简化返回值结构)
    2. 这个 Response 是指对每个单元格内容的检查的返回结果
    vegetablefriend
        8
    vegetablefriend  
    OP
       2024-04-30 14:51:53 +08:00
    最外层统一拦截,就不能做到每个单元格内容都检查完了,再汇总结果了
    vegetablefriend
        9
    vegetablefriend  
    OP
       2024-04-30 14:52:48 +08:00
    @crudbychang 提供了一个新的思路,
    vegetablefriend
        10
    vegetablefriend  
    OP
       2024-04-30 14:55:02 +08:00
    vegetablefriend
        11
    vegetablefriend  
    OP
       2024-04-30 14:57:59 +08:00
    @vivisidea 我的 mentor 也建议是这种方式

    跑个题,v 站这个回复功能有点诡异,经常莫名其妙发一条空的回复出去,刚才给另外一位老哥回复就已经发生了一次...
    xubeiyou
        12
    xubeiyou  
       2024-04-30 15:56:57 +08:00
    用 easyexcel 解析后逐行处理 之后做字符串拼接 拼接后放在单独的列里面。存储下来就导出了,之前就这么做的 支持大概 10W 以内的吧 默认情况下 如果需要大数据量的话 就得分 sheet 解析了
    k9990009
        13
    k9990009  
       2024-04-30 16:10:31 +08:00
    你这个需求我搞过,大量的 excel 模板要校验,用的 easypoi,先解析成业务 POI 对象,再验证,解析和验证职责分开,不建议直接用 cell 。
    对象实现一个支持收集错误信息的接口去收集每一行的错误信息。校验方式有单字段格式校验、行与行校验、列与列校验,与外部数据源校验。有错误信息,额外加一列导出。还做了错误单元格标红,用的是每个字段都额外创建额外字段标记的,使用反射获取这个额外字段。校验都尽量抽成规则,后面做了个在线编辑版,校验代码才发现没法复用。
    xywanghb
        14
    xywanghb  
       2024-04-30 17:37:32 +08:00
    易于变化的业务考虑适当扩展, 不易于变化的要高度内聚并极大可能的降低理解成本维护成本,怎么简单怎么来, 我个人感觉这个不易于变化, 推荐第二种
    a5X77vajGRyLA2aF
        15
    a5X77vajGRyLA2aF  
       2024-05-01 23:02:54 +08:00 via Android
    我实际开发中的处理:
    1. 上传文件后,在业务表中插入一条待验证记录,响应上传成功
    2. 定时读取待验证记录,流式读文件,逐行检验,在单元格内用[]记录验证失败原因,输出到新文件。有异常则上传新文件。
    3. 修改验证状态

    整体就是加个用户上传记录,后台异步检验的思路。
    如果是对接服务端的,追求实时性,还可以主动回调/推送检验结果
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5741 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:32 PVG 10:32 LAX 18:32 JFK 21:32
    Do have faith in what you're doing.
    ubao msn 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