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

2021-06-10 09:07:57 +08:00
 newee

最近写了几坨....代码....
其中有几坨高度相似,最近看到 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 改一下就完了,但是还是想问一下各位大神们有没有什么好的处理方法。

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

2231 次点击
所在节点    问与答
21 条回复
haokuderen
2021-06-10 09:14:45 +08:00
设计模式
3dwelcome
2021-06-10 09:18:46 +08:00
java 不愧是最啰嗦的语言,没让我失望。
manami
2021-06-10 09:20:13 +08:00
Leviathann
2021-06-10 09:27:14 +08:00
其实就三行
没啥好抽的
newee
2021-06-10 09:30:35 +08:00
@haokuderen 好吧 感觉自己基础薄弱 有时间去研究一下设计模式 看有没有什么好的方法
@3dwelcome 这就尴尬了 是我比较菜 没写得优雅
@manami 图片打不开
@Leviathann 好吧 感觉也是
Leviathann
2021-06-10 09:53:40 +08:00
@newee 看起来长主要是类型声明然后还有 `collect(Collectors.toList())` 这种模板代码
类型声明直接用 idea 的 .var 后缀快捷输入就行,然后常用的单步 stream 操作 filter map 也可以抽几个 util 啥的
THESDZ
2021-06-10 10:13:17 +08:00
这个地方已经没啥封装的必要了,抽成为代码就是

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

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

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

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

Map<Long, ?> getList(Page page, Function page2Id, QueryInfoDto dto1, RespDto dto2) {}
luzhh
2021-06-10 10:42:54 +08:00
@luzhh #9 少写了一个查数据的方法入参,利用好范型使用。不知道实际各个类是咋样的,参数可以更简单一些
66beta
2021-06-10 10:44:41 +08:00
@3dwelcome
Object-C:我不服
xz410236056
2021-06-10 10:47:45 +08:00
@66beta OC 哪里啰嗦。。
xz410236056
2021-06-10 10:49:04 +08:00
@3dwelcome java 也有域运算符了吗
qiuhang
2021-06-10 14:25:10 +08:00
就这样挺好的。建议业务代码不要过度封装,更不要随便用设计模式,cv 就 cv 了,简单易读才是硬道理。
7gugu
2021-06-10 14:26:25 +08:00
@manami 你这个就过分了啊。(不过这个花体叫什么?感觉写作会很好看。)
sheepzh
2021-06-10 14:36:31 +08:00
如果不懂业务框架(不是技术框架),或者说对未来业务发展没有把控力的话,我觉得这种体量的业务代码,直接一把撸最好。不用过度抽象和设计了了。
neptuno
2021-06-10 14:46:56 +08:00
@manami 过于优雅了 hhh
neptuno
2021-06-10 14:49:11 +08:00
就这样挺好的,没必要为了抽象而抽象
darksword21
2021-06-10 15:20:52 +08:00
千万别一件小事封装的代码他妈都不认识他然后除了你自己根本没人用你封装过的代码,没错说的就是我们 leader
newee
2021-06-10 20:05:49 +08:00
感谢各位大佬的热心帮助 学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782537

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX