newee
V2EX  ›  问与答

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

  •  
  •   newee · Jun 10, 2021 · 3298 views
    This topic created in 1973 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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