带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(5)

简介: 带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(5)

带你读《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、测试和不断重构、精炼的过程中所花费的时间,一定会在将来多倍的回报。

 

团队介绍

 

大淘宝技术移动技术中台,推进淘宝、天猫等架构升级,致力于为淘系、整个集团提供基础核心能力、产品与解决方案:

  1. 业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应限流、隔离与熔断的柔性高可用解决方案, 站点高可用:故障自愈、多机房与异地容灾与快速切流恢复);
  2. 新一代的业务研发模式FaaS(一站式函数研发Gaia平台);
  3. 下一代网络协议QUIC实现与落地;
  4. 移动中间件(API网关MTop、域名调度AMDC、消息/发布订阅/推送、文件上传AUS、移动配置推送Orange 等等)。
相关文章
|
新零售 前端开发 JavaScript
盒马跨端设计系统 ReX Design For OS
6 个月前,在 D2 前端技术论上我们向社区分享了《盒马中后台跨端方案》,详细介绍了我们在基于盒马实体零售数字化业务场景中,面向盒马营运数字化系统构建的跨端设计系统——ReX Design For OS。6 个月来,在开发资源极度紧张的状态下,我们持续建设和打磨,今天我们很高兴的告诉大家我们已经将项目的主要代码开源到了 Github,并发布了 beta 版本。
盒马跨端设计系统 ReX Design For OS
|
存储 UED 算法
|
存储 JavaScript 前端开发
jQuery 入门&选择器
jQuery 入门&选择器
162 0
|
JSON 前端开发 Java
【SpringMVC】基础入门(1)
spirngMVC,RequestMapping建立连接,RequestController,Requestparam,RequestBody传递参数、对象、数组、集合、JSON数据,JSON字符串和JAVA对象的转换
|
前端开发 C# Windows
在WPF程序中实现PropertyGrid功能
【11月更文挑战第15天】PropertyGrid 是一个用户界面组件,用于直观地查看和编辑对象属性。在 WPF 中可通过组合 Expander 和 DataGrid 实现基本功能,或使用第三方库 PropertyTools 获得更强大特性,包括属性验证和类型特定编辑器。
1068 3
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
1436 1
|
测试技术 uml
UML——交互图( 时序图和协作图)
UML——交互图( 时序图和协作图)
|
机器学习/深度学习 自然语言处理 算法
进阶RAG:探索前沿应用与挑战
【10月更文挑战第21天】
527 0
|
敏捷开发 运维 Devops
现代软件测试方法与挑战
在当今高度数字化和技术化的时代,软件测试成为保证产品质量和用户体验的关键环节。本文探讨了现代软件测试方法的演进和面临的挑战,从传统到自动化测试的转变,以及如何应对复杂性和快速变化的软件开发环境。
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
346 0