V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
newee
V2EX  ›  问与答

不懂就问,如何改善一下代码

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

    最近写了几坨....代码....
    其中有几坨高度相似,最近看到 DRY 原则,不知道能不能... 改善一下

    // 根据用户 id 获取用户列表数据
    List<Long> userIds = page.getList().stream().map(ArticleRespDto::getUserId).collect(Collectors.toList());
    UserQueryDto userQueryDto = UserQueryDto.builder().idList(userIds).build();
    ResponseBase<List<UserRespDto>> userResponse = userQueryApi.queryByParam(userQueryDto);
    List<UserRespDto> userList = ResponseUtil.checkResponse(userResponse);
    Map<Long, UserRespDto> userMap = CollectionUtils.listToMap("id", userList);
    
    // 根据商品 Id 获取商品列表数据
    List<Long> productIds = page.getList().stream().map(ArticleRespDto::getProductId).collect(Collectors.toList());
    ReleaseOrderQueryDto releaseOrderQueryDto = ReleaseOrderQueryDto.builder().idList(productIds).build();
    ResponseBase<List<ReleaseOrderRespDto>> releaseResponse = releaseOrderQueryApi.queryByParam(releaseOrderQueryDto);
    List<ReleaseOrderRespDto> releaseList = ResponseUtil.checkResponse(releaseResponse);
    Map<Long, ReleaseOrderRespDto> releaseMap = CollectionUtils.listToMap("id", releaseList);
    
    

    就是上面两坨,功能就是通过 ids 集合,获取数据.... 中间用不同的 service 去请求数据.... 虽然 ctrl C+V 改一下就完了,但是还是想问一下各位大神们有没有什么好的处理方法。

    俺是比较菜,代码写的不好,问的简单也别笑话我......

    21 条回复    2021-06-10 20:41:21 +08:00
    haokuderen
        1
    haokuderen  
       182 天前
    设计模式
    3dwelcome
        2
    3dwelcome  
       182 天前
    java 不愧是最啰嗦的语言,没让我失望。
    manami
        3
    manami  
       182 天前   ❤️ 1
    Leviathann
        4
    Leviathann  
       182 天前 via iPhone
    其实就三行
    没啥好抽的
    newee
        5
    newee  
    OP
       182 天前
    @haokuderen 好吧 感觉自己基础薄弱 有时间去研究一下设计模式 看有没有什么好的方法
    @3dwelcome 这就尴尬了 是我比较菜 没写得优雅
    @manami 图片打不开
    @Leviathann 好吧 感觉也是
    Leviathann
        6
    Leviathann  
       182 天前
    @newee 看起来长主要是类型声明然后还有 `collect(Collectors.toList())` 这种模板代码
    类型声明直接用 idea 的 .var 后缀快捷输入就行,然后常用的单步 stream 操作 filter map 也可以抽几个 util 啥的
    THESDZ
        7
    THESDZ  
       182 天前
    这个地方已经没啥封装的必要了,抽成为代码就是

    //提取 id 列表
    //通过 id 列表查询实体列表
    //校验返回是否成功
    //list2map

    其中公共的地方已经使用了 java 的封装
    - 提取 id 列表
    - 校验返回
    - list2map

    如果再封装,个人觉得没必要

    不要为了封装而封装,尤其是业务代码
    非业务代码,或者固定业务模式的代码可以进行封装
    beichenhpy
        8
    beichenhpy  
       182 天前
    没有必要过度封装甚至过度使用设计模式,这样我觉得很清晰,每一步该做什么后续维护的人也可以明白
    如果 [根据 id 获取用户列表数据 /根据商品 id 获取商品列表数据] 涉及到重用,可以封装为方法
    luzhh
        9
    luzhh  
       182 天前
    你这个很明显,可以封装:

    Map<Long, ?> getList(Page page, Function page2Id, QueryInfoDto dto1, RespDto dto2) {}
    luzhh
        10
    luzhh  
       182 天前
    @luzhh #9 少写了一个查数据的方法入参,利用好范型使用。不知道实际各个类是咋样的,参数可以更简单一些
    66beta
        11
    66beta  
       182 天前
    @3dwelcome
    Object-C:我不服
    xz410236056
        12
    xz410236056  
       182 天前
    @66beta OC 哪里啰嗦。。
    xz410236056
        13
    xz410236056  
       182 天前
    @3dwelcome java 也有域运算符了吗
    qiuhang
        14
    qiuhang  
       181 天前
    就这样挺好的。建议业务代码不要过度封装,更不要随便用设计模式,cv 就 cv 了,简单易读才是硬道理。
    7gugu
        15
    7gugu  
       181 天前
    @manami 你这个就过分了啊。(不过这个花体叫什么?感觉写作会很好看。)
    sheepzh
        16
    sheepzh  
       181 天前
    如果不懂业务框架(不是技术框架),或者说对未来业务发展没有把控力的话,我觉得这种体量的业务代码,直接一把撸最好。不用过度抽象和设计了了。
    neptuno
        17
    neptuno  
       181 天前
    @manami 过于优雅了 hhh
    neptuno
        18
    neptuno  
       181 天前
    就这样挺好的,没必要为了抽象而抽象
    darksword21
        19
    darksword21  
       181 天前 via iPhone
    千万别一件小事封装的代码他妈都不认识他然后除了你自己根本没人用你封装过的代码,没错说的就是我们 leader
    newee
        20
    newee  
    OP
       181 天前
    感谢各位大佬的热心帮助 学习了
    css3
        21
    css3  
       181 天前
    猛一看以为乱码😂
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3218 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:09 · PVG 12:09 · LAX 20:09 · JFK 23:09
    ♥ Do have faith in what you're doing.