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

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

  •  
  •   vegetablefriend · 216 天前 · 2430 次点击
    这是一个创建于 216 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    遂设计函数如下:

    public Object parse(Cell cell) {
        if (wrongFormat(cell)) {
            reutrn null;
        }
        
      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  
       216 天前   ❤️ 4
    建议,直接报错即可。在最外层统一拦截,,,

    至于报错展示一个,还是展示所有。。。可以实际情况而定。
    NotFoundEgg
        2
    NotFoundEgg  
       216 天前   ❤️ 1
    定义一个业务异常类,外部只 catch 这个类型做处理
    crudbychang
        3
    crudbychang  
       216 天前   ❤️ 1
    可以考虑把错误信息用标记再批注写回,用 EasyExcel 可以很容易做
    vivisidea
        4
    vivisidea  
       216 天前   ❤️ 1
    ```
    public class Response {
    // enum errorType;
    String errorMessage;
    Object parseResult;
    }
    ```

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

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

    其次,你的汇总结果当中要包含什么有价值的信息?是否要包含单元格的位置,单元格的内容,以及为什么有问题?所以你的 Response 里面是不是应该有一个 List ?
    vegetablefriend
        6
    vegetablefriend  
    OP
       216 天前
    vegetablefriend
        7
    vegetablefriend  
    OP
       216 天前
    @yidinghe

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

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

    整体就是加个用户上传记录,后台异步检验的思路。
    如果是对接服务端的,追求实时性,还可以主动回调/推送检验结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5200 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.