当前位置: 首页 > news >正文

【优化代码结构】函数的参数归一化

某些封装的函数,其参数具有多样性,会导致函数中会增加非常多的分支,比如下面这个 format 函数有如下几种参数方式,其中 formatter 会有很多种情况

  • date:日期对象
  • formatter:
    • ‘date’:格式化日期
    • ‘datetime’:带有时间
    • 可自定义返回格式
    • 自行处理的函数
  • isPad:是否补零
function format(date, formatter, isPad = false) {...
}
// 2024-9-29
format(new Date(), 'date')// 2024-9-29 7:3:10
format(new Date(), 'datetime')// 2024-09-29
format(new Date(), 'date', true)// 2024-09-29 07:03:10
format(new Date(), 'datetime', true)// 2024年09月29日 07:03:10
format(new Date(), 'yyyy年MM月dd日 HH:mm:ss.ms ', true)// 2024年9月29日 7:3:10
format(new Date('2012-12-31'), (dateInfo => {const { year } = dateInfoconst thisYear = new Date().getFullYear()if (year < thisYear) {return `${thisYear - year}年前`} else if (year > thisYear) {return `${year - thisYear}年后`} else {return '今年'}
}))

可以通过 参数归一化,选择一种能涵盖其他情况的参数,在本例中选择功能最灵活且强大的函数类型参数

封装辅助函数,返回归一化的结果(函数)

function _formatNormalize(formatter){if(typeof formatter === 'function'){return formatter}if(typeof formatter !== 'string'){throw new TypeError('参数类型必须为字符串或函数')}return ()=>{...}
}function format(date, formatter, isPad = false) {formatter = _formatNormalize(formatter)formatter()
}

处理完 函数非字符串 类型,继续分析 字符串类型 参数,它可能为 date、datetime以及模版字符串三种形式,挑选出其中功能最强大的方式:模版字符串,然后使用模版字符串替代date、和datetime的情况。

function _formatNormalize(formatter) {if (typeof formatter === 'function') {return formatter}if (typeof formatter !== 'string') {throw new TypeError('参数类型必须为字符串或函数')}if (formatter === 'date') {formatter = 'yyyy-MM-dd'}else if (formatter === 'datetime') {formatter = 'yyyy-MM-dd HH:mm:ss'}return (dateInfo) => {const { year, month, day, hour, minute, second, millisecond } = dateInforeturn formatter.replace('yyyy', year).replace('MM', month).replace('dd', day).replace('HH', hour).replace('mm', minute).replace('ss', second).replace('ms', millisecond)}
}

将参数的多样性选择抽离到辅助函数中,实现对 formatter参数 归一化

function formate(date, formatter, isPad = false) {formatter = _formatNormalize(formatter)const dateInfo = {year: date.getFullYear(),month: date.getMonth() + 1,day: date.getDate(),hour: date.getHours(),minute: date.getMinutes(),second: date.getSeconds(),millisecond: date.getMilliseconds(),}if (isPad) {dateInfo.year = dateInfo.year.toString().padStart(4, '0')dateInfo.month = dateInfo.month.toString().padStart(2, '0')dateInfo.day = dateInfo.day.toString().padStart(2, '0')dateInfo.hour = dateInfo.hour.toString().padStart(2, '0')dateInfo.minute = dateInfo.minute.toString().padStart(2, '0')dateInfo.second = dateInfo.second.toString().padStart(2, '0')dateInfo.millisecond = dateInfo.millisecond.toString().padStart(3, '0')}return formatter(dateInfo)
}
http://www.lryc.cn/news/450952.html

相关文章:

  • CSS中height设置100vh和100%的区别
  • 红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示
  • QEMU使用Qemu-Guest-Agent传输文件、执行指令等
  • 【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞
  • 复数表示的电场
  • 常用快捷键整理
  • 【Transformer】长距离依赖
  • Git傻傻分不清楚(下)
  • golang学习笔记27-反射【重要】
  • 利用Puppeteer-Har记录与分析网页抓取中的性能数据
  • YOLOv5改进系列(1)——添加CBAM注意力机制
  • 无头单向非循环java版的模拟实现
  • Bert Score-文本相似性评估
  • Pyenv管理Python版本,conda之外的另一套python版本管理解决方案
  • 快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标
  • css的页面布局属性
  • RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!
  • 【React】入门Day01 —— 从基础概念到实战应用
  • <<机器学习实战>>10-11节笔记:生成器与线性回归手动实现
  • 链表OJ经典题目及思路总结(一)
  • 初识chatgpt
  • 【60天备战2024年11月软考高级系统架构设计师——第33天:云计算与大数据架构——大数据处理框架的应用场景】
  • 如何设计具体项目的数据库管理
  • 对于 Vue CLI 项目如何引入Echarts以及动态获取数据
  • 【Linux笔记】在VMware中,为基于NAT模式运行的CentOS虚拟机设置固定的网络IP地址
  • 一文上手Kafka【中】
  • Ubuntu如何如何安装tcpdump
  • 3-3 AUTOSAR RTE 对SR Port的作用
  • hive/impala/mysql几种数据库的sql常用写法和函数说明
  • 论文阅读:LM-Cocktail: Resilient Tuning of Language Models via Model Merging