带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)https://developer.aliyun.com/article/1339966?groupCode=taobaotech
使用mapWithResource
1 Source.from( 2 Arrays.asList( 3 "SELECT * FROM shop ORDER BY article-0000 order by gmtModified desc limit 100;", 4 "SELECT * FROM shop ORDER BY article-0001 order by gmtModified desc limit 100;")) 5 .mapWithResource( 6 () -> dbDriver.create(url, userName, password), 7 (connection, query) -> db.doQuery(connection, query).toList(), 8 connection -> { 9 connection.close(); 10 return Optional.empty(); 11 }) 12 .mapConcat(elems -> elems) 13 .runForeach(System.out::println, system);
假设我们有一组 SQL 需要进行处理,我们需要从数据库中的多个表中查询对应的结果,并将最终结果进行合并和输出到控制台。在mapWithResource 的帮助下,我们可以极大的简化我们的代码:
在上面的例子中:我们有一组预先定义好的 SQL,分别从多个表中读取最新的 100 条数据,通过使用mapWi- thResource ,我们优雅地为每个流创建了 db 相关的连接,并进行对应的查询操作,并合并查询结果,在流处理完成后,关闭对应的资源。上面的代码通过复用我们前面编写的 mapWithResource 将复杂资源和生命周期管理进行了简化,作为对比,大家可以思考一下如果我们不使用已有抽象所需要付出的努力。
总结
在上面的例子中,我们通过 statefulMap以及和其他的操作符相互组合,实现了很多和状态、生命周期相关的操作符,而代码量则大大减少。基于一个经过考验的操作符来编写自定义操作符,也能进一步降低出错的概率,以及代码审查的难度。而相关的操作符都是通过一个底层的 statefulMap 来实现。映射到我们的工作中则是尽可能地抽象、提炼,对系统的核心模型、核心功能进行打磨,从而每个应用都有一个精巧的内核,并和其他的应用构成丰富的生态。而非上来就 复制、粘贴,重复造轮子;避免最终陷入复制、粘贴的泥潭中。虽然有时我们可能没有足够的时间来进一步抽象,而是业务先行。但是我依然建议,在后续的实践中,进行不断回顾和提炼,在保障系统稳定可靠、在有测试手段保障的情况下,进行逐步的重构,使得系统更加容易理解、维护和稳固。
笔者相信:磨刀不误砍柴工,在设计、方案review、测试和不断重构、精炼的过程中所花费的时间,一定会在将来多倍的回报。
团队介绍
大淘宝技术移动技术中台,推进淘宝、天猫等架构升级,致力于为淘系、整个集团提供基础核心能力、产品与解决方案:
- 业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应限流、隔离与熔断的柔性高可用解决方案, 站点高可用:故障自愈、多机房与异地容灾与快速切流恢复);
- 新一代的业务研发模式FaaS(一站式函数研发Gaia平台);
- 下一代网络协议QUIC实现与落地;
- 移动中间件(API网关MTop、域名调度AMDC、消息/发布订阅/推送、文件上传AUS、移动配置推送Orange 等等)。