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

在开发时你们有使用 Spring 的 Assert 工具类的习惯吗?

  •  
  •   grittiness · 2019-08-16 16:13:01 +08:00 via Android · 4323 次点击
    这是一个创建于 1955 天前的主题,其中的信息可能已经有所发展或是发生改变。
    写接口的时候,特别是入参多的时候很烦要 if 一堆逻辑判断入参是否正确,我就在公司项目都使用了 Spring 自带的 Assert 工具类,感觉比一堆 if 判断省事太多。。

    今天同事偶然看到了我写的这部分代码,就跟我说平常不要用 Assert,这是测试时候用不是开发上线用。然后还表达了说这个工具类是抛 RuntimeException 会影响性能之类的说法。


    我自己是认为通过这个工具类校验能节省很多 if 校验代码,Spring 的 Assert 也跟 JDK 里面测试用的 assert 也没啥关系,但是不知道用异常方式处理对性能的影响能有多大


    感觉这样很尴尬,为了避免同事意见,是不是还是换回一堆 if 判断更合适?😂
    18 条回复    2019-08-17 16:34:35 +08:00
    Asens
        1
    Asens  
       2019-08-16 16:31:00 +08:00
    试试 fluent-validator
    arrow8899
        2
    arrow8899  
       2019-08-16 16:33:25 +08:00
    assert 没毛病,符合 FailFast 理念,if 太多,容错性虽然好了,但是出了问题不好查原因
    lihongjie0209
        3
    lihongjie0209  
       2019-08-16 16:37:04 +08:00
    那就用 guava 的 precondition
    chendy
        4
    chendy  
       2019-08-16 16:38:24 +08:00
    一堆 if-else 不可取,很多库都有封装这种参数校验 /断言的功能,不满足需求的话就自己封装一些
    另外一说还有 jsr-303 可用
    再另外一说 Assert 是测试用的不是上线用的怕不是对 Assert 有什么误解
    Cbdy
        5
    Cbdy  
       2019-08-16 16:39:46 +08:00   ❤️ 2
    我认为用 Assert 是个好习惯
    类似的比如 Guava 的 Preconditions,JDK 的 Objects::requireNonNull
    看各大框架源代码基本已经是公认的最佳实践了,异常情况抛异常,Happy path 处理逻辑,比 Golang 的 if err != nil 不知道高到哪里去
    Takamine
        6
    Takamine  
       2019-08-16 16:44:57 +08:00
    请问一下用了 Assert 之后抛出响应异常之后是怎么处理的。
    Takamine
        7
    Takamine  
       2019-08-16 16:45:25 +08:00
    @Takamine 响应=>相应。
    Cbdy
        8
    Cbdy  
       2019-08-16 16:52:20 +08:00
    @Takamine 库、组件让调用方处理,应用让用户处理
    比如:Assert.hasText(searchConditon, "请输入合法搜索条件!");
    qwerthhusn
        9
    qwerthhusn  
       2019-08-16 16:52:36 +08:00   ❤️ 2
    抛 RuntimeException 确实非常效率低,但是也是建立在有大量异常抛出的情况下,如果这种情况发生了,只能说明这程序有 BUG。。
    有些框架使用 fail-fast。几乎都是用的 Assert。这时候他们会用自定义的 Assert,跑出来的异常类重写了 fillInStackTrace 方法直接 return this,这样异常也变得没那么慢了,坏处就是没有了异常堆栈
    grittiness
        10
    grittiness  
    OP
       2019-08-16 16:54:29 +08:00 via Android
    @Cbdy 其实现在是要不要和其他同事统一的问题了,现在就显得你很另类的一样,就你一个人用 Assert。

    我是不想用一堆 if 的,用 Assert 还有一个理由是在 Service 里面封装了两三层逻辑后,发现流程有问题要返回失败信息给前端的时候,我只能想到用 Exception 的方式来处理,要不然一层一层 return 再判断是否继续,这样的逻辑写起来就感觉很难受。

    不过我是新人,入职不到一年,然后同事是好几年的老员工,我感觉也不好对同事反驳什么😂
    warcraft1236
        11
    warcraft1236  
       2019-08-16 16:57:54 +08:00
    validator 啊
    grittiness
        12
    grittiness  
    OP
       2019-08-16 16:58:53 +08:00 via Android
    @Takamine 因为是前后端分离项目,我是直接用 Spring 的全局异常处理方式,实现 HandlerExceptionResolver 以后把异常信息转 JSON 返回前端
    grittiness
        13
    grittiness  
    OP
       2019-08-16 17:02:58 +08:00 via Android
    @qwerthhusn 学习到了,我以后去尝试一下这样的异常处理方式,谢谢
    bobuick
        14
    bobuick  
       2019-08-16 17:04:12 +08:00   ❤️ 2
    参数校验稍微多一点的话, 用 assert 其实算不上方便, validator 吧.
    另外这么用是没毛病的, failfast 原则. if 一大堆才是有毛病, 写个 web 还讲究到 jvm 的异常性能级别了, 你以为你在写 OS 呢, 做什么层级的工作考虑什么层级的事. crud 就是要讲究可读和可维护性, 这点破性能还不够塞牙缝的, 而且异常既然叫异常就是偶尔才会发生的
    BBCCBB
        15
    BBCCBB  
       2019-08-16 17:15:01 +08:00
    该用的时候就用, 99.9%的情况不需要考虑 Assert 带来的性能影响.
    luozic
        16
    luozic  
       2019-08-16 17:41:55 +08:00 via iPhone
    用了 spring 了还在乎这点性能?
    sampeng
        17
    sampeng  
       2019-08-17 12:05:32 +08:00 via iPhone
    lz,不要把工龄当回事。很多人是把 1 年的事重复做 N 年。如果你不想这样。按自己的想法走
    Jrue0011
        18
    Jrue0011  
       2019-08-17 16:34:35 +08:00
    if/else 和 Assert 其实目的都不一样吧。。。参数在这个场景下是必须的就用 Assert 或者 Objects.requireNonNull(),不是必须的就用 if/else 或者 Optional
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3590 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:54 · PVG 12:54 · LAX 20:54 · JFK 23:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.