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

大佬们, 请教一下关于 Java 后端 Service 层

  •  
  •   vyuai · 26 天前 · 1715 次点击
    https://imgur.com/LRbzXFg
    https://imgur.com/K3thJ6I
    https://imgur.com/LyiGbsm
    1.大佬们, 这样理解对嘛, 第二张图是我思考的, 开发 Service 需要考虑调用的情况嘛, 虽然 Controller 层进行了 @Valid, 如果自己或者别人直接调用 roleId 和 employeeIdList 还是会出现空指针, 是否还需要加上校验呢, 一般企业开发需要考虑到 service 自己和别人调用的情况嘛
    13 条回复    2024-10-26 02:04:56 +08:00
    vuevue
        1
    vuevue  
       26 天前 via iPhone
    为什不问问神奇 gpt 呢
    wxw752
        2
    wxw752  
       26 天前
    我是加的,要防着同事一手
    iintothewind
        3
    iintothewind  
       26 天前
    public 方法, 对传入参数要做防御性判断, 并打印 log.
    看你代码, 好像这两个都没做, 这在大厂恐怕不能通过 review.

    上线出问题你都不知道是不是你代码自己的问题, 还是别人传入参数的问题.
    vyuai
        4
    vyuai  
    OP
       26 天前
    @wxw752 大佬, 如果加上校验, 返回什么比较合适呢, 错误提示嘛
    /**
    * 批量删除角色员工关系
    *
    * @param roleEmployeeUpdateForm
    * @return
    */
    public ResponseDTO<String> batchDeleteRoleEmployee(RoleEmployeeUpdateForm roleEmployeeUpdateForm) {
    if (roleEmployeeUpdateForm.getRoleId() == null || CollectionUtils.isEmpty(roleEmployeeUpdateForm.getEmployeeIdList())) {
    ResponseDTO.error(UserErrorCode.PARAM_ERROR, "参数错误");
    }
    roleEmployeeDao.batchDeleteRoleEmployee(roleEmployeeUpdateForm.getRoleId(), roleEmployeeUpdateForm.getEmployeeIdList());
    return ResponseDTO.ok();
    } 类似这样嘛
    vyuai
        5
    vyuai  
    OP
       26 天前
    @vuevue 问了, 但是很多场景不太理解, 有些也是看情况而定
    vyuai
        6
    vyuai  
    OP
       26 天前
    @iintothewind 感谢大佬, 看来还是要考虑各个方面问题
    iintothewind
        7
    iintothewind  
       26 天前
    看上下文以及自己需求, 如果允许代码 break, 就抛 exception,
    如果还有返回那就自己 handle, 返回约定的结果,
    但重要是的是打印 log, 防止扯皮,
    在大厂, 上线非常重要的是打印 log, 要不然你自己说不清楚, 出问题, 锅就是你的.
    vyuai
        8
    vyuai  
    OP
       26 天前
    @iintothewind 日志的话, 一般打印错误日志和成功日志嘛, 如果发生异常有全局异常处理类做日志打印, service 层还需要打印吗
    vyuai
        9
    vyuai  
    OP
       26 天前
    @iintothewind 好的, 感谢感谢
    iintothewind
        10
    iintothewind  
       26 天前
    你这个真的受 spring 影响太深了, 你还指望全局 handler 给你兜着啊?

    那 Error Handling 得做的多糟糕才跑到做全局 handling,
    所谓的全局 error handling 难道不是就打印一下啥都不做吗? 跑那去你业务代码上下文早没了, 你还能看到啥啊?


    public 方法, 入口参数肯定要打印 log 的, 成功和失败看情况啊, 失败的上下文 log 更重要.
    vyuai
        11
    vyuai  
    OP
       26 天前
    @iintothewind 明白了, 日志是不是一般在 service 层打印, 感觉 controller 好像打印入口参数好像更准确, 可是我最近在学习一个开源项目(SmartAdmin)
    看他们规范说 controller 层
    1. 不做任何的业务逻辑操作
    2. 不做任何的参数、业务校验,参数校验只允许使用 @Valid 注解做简单的校验
    3. 不做任何的数据组合、拼装、赋值等操作
    4. 只能在 controller 层获取当前请求用户,并传递给 service 层。

    主要为了学习代码编码风格和规范, 看哪些开源项目比较好啊, 或者看什么别的东西

    目前看的是 SmartAdmin 这个开源项目学习, 大佬有了解的嘛, 看哪位作者的风格比较好呢, 若依实在不喜欢, 目前觉得这个 SmartAdmin 对我帮助很大
    iintothewind
        12
    iintothewind  
       26 天前
    我不知道, 反正学习打 log 在大厂爬屎山第一课, 出了不要暴露 PII 信息之外, 没有什么不能打的, 毕竟是为了防止自己背锅的.
    其它的我不知道, 代码风格每个团队不同, 没有对错, 你有话语权你就能决定团队该用什么风格, 你没有你听别人的, 都一样怕屎山, 没有什么高低之分.
    vyuai
        13
    vyuai  
    OP
       26 天前
    @iintothewind 好的 感谢您
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5163 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 09:16 · PVG 17:16 · LAX 01:16 · JFK 04:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.