【设计模式】使用 Builder 模式优化参数极多的函数

embedded/2024/10/22 14:29:30/

Builder(生成器)模式,让开发者能一步一步地创建复杂的对象。

优化参数极多的函数

常规方法定义的函数

一些函数,比如提交表单,需要的参数非常多,按照常规的写法,可能会定义为这样:

function submit(name, phone, idCard, age, ...more) {}

这样定义的问题是:需要将参数写在固定的位置,随着参数的增多,这种传参方式会变得难以维护。

如果遇到某些定义在中间位置的参数为可选参数时,比如上面定义的 idCard,传参就变成了下面这样:

submit('zkb', '188', '', 18, ...)

将参数合并到一个对象中传入

function submit(params) {const name = params.nameconst phone = params.phone// ...
}

将参数合并到一个对象中传入可以缓解上面的问题,但这种方法也有缺点。

必须查看文档或者到方法的源码中才能知道这个方法具体需要什么参数。

使用 Builder 模式优化

Builder 模式改造的思想就是,不直接调用函数,而是提供一个生成器函数,在生成器函数中拆解函数的参数,分段存入,最后再执行 submit() 函数。

function submit(params) {const name = params.nameconst phone = params.phone// ...
}class SubmitBuilder() {name // 名称phone // 手机号setIdCard // 身份证号get age() {if(this.idCard) {// 从身份证号中提取}return ''}// ...setBaseInfo(name, phone) {this.name = namethis.phone = phone}setIdCard(idCard) {this.idCard = idCard}invoke() {submit({name: this.name,phone: this.phone,// ...})}
}

这时提交表单时的操作就变成了:

const submitBuilder = new SubmitBuilder()submitBuilder.setBaseInfo('zkb', '188').setIdCard('').invoke()

可以看到,Builder 模式让代码变得比原来清晰许多,这样做有这些好处:

  • 让开发者不用直接去调用复杂的方法,而是可以再辅助类的引导下一步一步填充参数。
  • 如果参数之间有联动关系,可以在 set() 方法中去操作。
  • 如果一个参数可以由另一个参数推导出来,可以用 getter 来定义前者。
  • 可以确保某些参数必须同时传。
  • 添加参数时易于扩展、维护。

优化构造函数

可以用同样的方式优化构造函数,只是最后执行操作的方法名改为 build,当然这只是一个建议。

参考

《Node.js设计模式


http://www.ppmy.cn/embedded/10536.html

相关文章

苍穹外卖day8(2)用户下单、微信支付

文章目录 前言一、用户下单1. 业务流程2. 接口设计3. 数据库设计3.1 订单表orders3.2 订单明细表 order_detail 4. 代码实现 二、订单支付 前言 用户下单 因为订单信息中包含了其他业务中的数据,在逻辑处理中涉及了多个其他业务,比如要判断地址簿、购物…

【二轮征稿】经济金融发展国际会议(ICEFD 2024)

一、【会议简介】 经济金融发展国际会议(ICEFD 2024)将于2024年4月26-28日在长沙盛大举行。会议旨在为从事国际社会经济金融发展研究的专家学者提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨&#xff0c…

【第五章】Java API-常用类库(上)

目录 1.字符串 String 1.1 不可变性(Immutability) 1.2 字符串常用方法 1.3 字符串常用方法举例 1.4 字符串 String——编程练习 2.基本类型与包装类型 2.1 包装类型 ( Wrapper Class) 2.2 基本类型和包装类型的转换: 2.3 包装类的作…

第十、十一章 折线图 + 地图 + 柱状图的绘制

第十章 折线图的绘制 官网:pyecharts - A Python Echarts Plotting Library built with love. 画廊官网:Document 懒人工具:懒人工具-手机APP工具下载-手机软件下载大全 - 173软件站 (ab173.com) 导学 json 定义 (1&#xff…

数据可视化(五):Pandas高级统计——函数映射、数据结构、分组聚合等问题解决,能否成为你的工作备用锦囊?

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Linux i2c-tool工具基础使用

一.i2cdetect i2cdetect 是一个用户空间程序,用于扫描 I2C 总线上的设备。它输出一个表格,其中包含指定总线上检测到的设备列表。以下是 i2cdetect 的使用方法: 运行扫描: 要执行 I2C 扫描,请使用以下命令&#xff1…

【GD32】_时钟架构及系统时钟频率配置

文章目录 一、有关时钟源二、系统时钟架构三、时钟树分析四、修改参数步骤1、设置外部晶振2、选择外部时钟源。3、 设置系统主频率大小4、修改PLL分频倍频系数 学习系统时钟架构和时钟树,验证及学习笔记如下,如有错误,欢迎指正。主要记录了总…

分布式与微服务的区别

首先分布式是一种系统部署模式,将一个系统分成多个不分进行运行。而微服务架构是一种更加精细化的设计方法,它是分布式的一个分支,主要强调将一个单体应用拆分成一组小型松耦合的服务,每个服务专注于单一业务功能并能够独立部署和…