当前位置: 首页 > 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.mrgr.cn/news/40314.html

相关文章:

  • Vscode、小皮面板安装
  • 问:聊聊JAVA线程池?
  • Wooey:将 Python 脚本转化为 Web 应用的简易解决方案
  • 深入理解Java中的垃圾回收机制
  • AI学习指南深度学习篇-批标准化Python实践
  • <<迷雾>> 第5章 从逻辑学到逻辑电路(3)--与门 示例电路
  • 职业生涯的三个阶段
  • 【初阶数据结构】详解插入排序 希尔排序(内含排序的概念和意义)
  • 《Windows PE》3.2.3 NT头-扩展头
  • Zig开发环境搭建
  • C++学习笔记----8、掌握类与对象(二)---- 成员函数的更多知识(1)
  • 基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统
  • 用Python实现运筹学——Day 8: 对偶理论的经济解释
  • VMware Aria Automation 8.18 发布,新增功能概览
  • plt等高线图的绘制
  • cmd下的管理员权限闪退 原理分析
  • 【分布式微服务云原生】消息队列全解析:原理、应用场景与主流MQ对比
  • c# iTextSharp 读取PDF
  • 每日学习一个数据结构-NFA非确定有限状态机
  • 短链接生成-短链接-短网址-短链接生成接口-短链接转换接口-短网址URL生成-短链接地址-短网址-短域名-短链接【快证api】