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

多If函数封装的策略

        在工作中我们经常遇到有多个if的判读函数,这是一件很正常的事情,如下:

let order = function (orderType, isPay, count) {if (orderType === 1) {// 充值 500if (isPay === true) {// 充值成功console.log('中奖100元')} else {if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}}} else if (orderType === 2) {// 充值 200if (isPay === true) {// 充值成功console.log('中奖20元')} else {if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}}} else if (orderType === 3) {// 不充钱if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}}
}

                但是在很多的时候里面的if的判断会包含很多方法和数据的处理,使一个函数经常会达到200行以上,那么有没有优化的方法呢?我们今天来看一看。

一、定义的策略

        言简意赅的说就是将每一个情况都第一个个方法,在需要的时候传入参数判断即可。

const strategy = {order500: function (isPay, count) {if (isPay === true) {// 充值成功console.log('中奖100元')} else {this.orderNoraml(isPay, count)}},order200: function (isPay, count) {// 充值 200if (isPay === true) {// 充值成功console.log('中奖20元')} else {this.orderNoraml(isPay, count)}},orderNoraml: function (isPay, count) {// 不充钱if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}},
}

        然后在使用的时候传入值进行函数判断,即可返回需要的参数。

function orderFunc(orderType, isPay, count) {let orderTypeObj = {1: 'order500',2: 'order200',3: 'orderNoraml'};return strategy[orderTypeObj[orderType]](isPay, count);
}orderFunc(1, true, 0)
orderFunc(1, false, 100)
orderFunc(2, true, 0)

二、责任链模式

        它的定义就是在你目前能够处理的情况进行处理,如果处理不了那么就到下一个函数,一直到可以处理的为止。

//原则:只处理单一模式,处理不了之后往后传
function order500(orderType, isPay, count) {if (orderType === 1 && isPay === true) {// 充值成功console.log('中奖100元')} else {order200(orderType, isPay, count)}
}function order200(orderType, isPay, count) {// 充值 200if (orderType === 2 && isPay === true) {// 充值成功console.log('中奖20元')} else {orderNoraml(orderType, isPay, count)}
}function orderNoraml(orderType, isPay, count) {// 不充钱if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}
}

        调用方法只需要执行一个函数就行了

order500(1, true, 100)
order500(1, true, 100)
order500(2, true, 0)

三、函数式模式

        其实我感觉应该使第二种方法的精简版,使每一个方法都继承他的下一个方法,然后让他们相互调用,形成一个循环。

        方法的定义主要体现到next下一个方法。

function order500(orderType, isPay, count) {if (orderType === 1 && isPay === true) {// 充值成功console.log('中奖100元')} else {return 'next'}
}function order200(orderType, isPay, count) {// 充值 200if (orderType === 2 && isPay === true) {// 充值成功console.log('中奖20元')} else {return 'next'}
}function orderNoraml(orderType, isPay, count) {// 不充钱if (count > 0) {console.log('抽到10元优惠卷')} else {console.log('请再接再励!')}
}

        定义一个class类用来继承

class chain {constructor(fn) {this.fn = fnthis.next = null}// 设置下一链条setNext(nextChain) {this.next = nextChain}// Run 起来passRequest() {console.log("this===>>",this)let res = this.fn.apply(this,arguments)if(res === 'next') {return this.next && this.next.passRequest.apply(this.next,arguments)}return res}
}

然后实现它,并且相互调用。

let order500Chain = new chain(order500)
let order200Chain = new chain(order200)
let orderNoramlChain = new chain(orderNoraml)order500Chain.setNext(order200Chain)
order200Chain.setNext(orderNoramlChain)order500Chain.passRequest(1, false, 100)

        是不是这种方法也很巧妙呢,在我们工作学习的过程中大家也可以试试把他们做成一个函数式的形式,一起加油吧。

相关文章:

多If函数封装的策略

在工作中我们经常遇到有多个if的判读函数,这是一件很正常的事情,如下: let order function (orderType, isPay, count) {if (orderType 1) {// 充值 500if (isPay true) {// 充值成功console.log(中奖100元)} else {if (count > 0) {c…...

238. 银河英雄传说

Powered by:NEFU AB-IN Link 文章目录238. 银河英雄传说题意思路代码238. 银河英雄传说 题意 有一个划分为 N列的星际战场,各列依次编号为 1,2,…,N 有 N艘战舰,也依次编号为 1,2,…,N,其中第 i号战舰处于第 i列。 有 T条指令,每…...

centos7 开机自启动自定义脚本

centos7 开机自启动自定义脚本背景配置自启动jar1.首先书写自启动脚本2.在rc.local中加入脚本reboot测试docker版本的自启动背景 项目中有遇到2个问题, 1: 使用java启动jar包 2: docker容器中自启动个服务。 这2个都要使用linux的开机自启动问…...

【Linux】动静态库的制作

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉动静库和静…...

数据备份学习笔记2

Linux实现本地备份的命令: mkdir -p /root/backup/date "%Y-%m-%d" tar -zcvPf /root/backup/date "%Y-%m-%d"/test20230221.tar.gz /root/test20230221/ 我们再看下tar命令选项: tar -czvf txt3.tar.gz txt3 tar -xvf txt4.tar.g…...

webRTC

WebRTC是一种实时通信技术,可以在浏览器中实现音频、视频和数据的实时传输。WebRTC使用标准的API和协议,如RTCPeerConnection和RTCDataChannel等,可以实现点对点通信和多方会议等多种应用场景。WebRTC可以应用于Web前端、移动端和桌面端等多种…...

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道,毕竟前几年刚发布的时候曾火遍全网,甚至都做成表情包了。 问题在于,凭什么认为这就是黑洞的照片,而不是一个甜甜圈啥的给整模糊了得到的呢?有什么理论依据吗&…...

Spring MVC常用功能及注解

目录 一、什么是Spring MVC 1.1 Spring MVC定义 1.2 MVC定义 1.3 MVC和Spring MVC的关系 1.4 Spring MVC的作用 二、Spring MVC的使用 2.1 Spring MVC的创建和连接 2.1.1 RequestMapping注解 2.1.2 GetMapping注解 2.1.3 PostMapping注解 2.2 获取参数 2.2.1 获取单…...

shell 编程

文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除(d 命令&#xf…...

Leetcode.1401 圆和矩形是否有重叠

题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating : 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1)是矩形左下角的坐标,而 (x2, y2)是右上角的坐标。 如果圆和矩…...

CHAPTER 3 Web Server - httpd配置(二)

Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例:1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…...

VSCode 连接 SSH 服务器

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129133964 配置VSCode 下载VSCode:https://code.visualstudio.com/ 安装 Remote - SSH: 点击右下角蓝色图标: 连接服务器: 即可。 默认连接:ssh chen…...

如何选择靠谱的插画培训课程

如何选择靠谱的插画培训课程,今天教你3个维度选择一个靠谱的插画培训班! 插画培训机构课程: 1.选择插画培训班时,要先考察课程,看看课程内容是否符合自己的需求,是否有助于提高插画技术。课程设置应该灵活…...

剑指 Offer 28. 对称的二叉树

剑指 Offer 28. 对称的二叉树 难度:easy\color{Green}{easy}easy 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下…...

深入Spring底层透析后置处理器之豁然开朗篇

目录前言Spring的后置处理器Bean工厂后置处理器Bean后置处理器自定义Component实现注解开发前言 看这篇文章之前,需要了解Bean创建的过程,本篇文章是接着bean创建的基本流程的续写 Bean创建的基本过程:http://t.csdn.cn/1lK2d Spring的后置处…...

软件测试(基础定义篇)

测试基础 1、什么是软件测试?2、常见的测试分类3、质量模型 4、软件测试流程 5、测试用例 6、测试用例设计方法 )1、什么是软件测试? 1、什么是软件? 答:软件是控制计算机硬件工作的工具。 2、软件的组成? 3、什么是…...

华为OD机试 - 寻找目标字符串 | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

使用echart绘制中国地图并显示人数

文章目录引言效果如图所示vue中echarts4.9版本,地图的使用引言 在做毕设的过程中,有一个需求:根据用户的ip,在前端展示出中国地图,然后展现出每个省有多少人这样子 经过百度后,发现可以使用echart来完成该…...

Git的常用命令

1:软件安装1.1:Git下载与安装百度上搜索Git官网:https://git-scm.com/下载:https://git-scm.com/download/win下载Git安装程序,双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…...

AcWing1018.最低通行费

1018.最低通行费一个商人穿过一个 NN 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 (2N−1)(2−1) 个单位时间穿越出去。而在经过中间的每个小方…...

推荐12个wordpress企业网站模板

WordPress企业网站模板是一种专为企业网站设计的WordPress主题,旨在帮助企业创建专业、美观且易于管理的网站。这些模板通常具备响应式设计、SEO优化、多语言支持等功能,能够满足不同行业和企业的需求。 WordPress企业网站模板的适用场景 企业官网&…...

基于 COM 的 XML 解析技术(MSXML) 的总结

✅ 一、COM 与 MSXML 简要说明 🔷 什么是 COM? COM(Component Object Model)是一种 Windows 平台下的组件技术,可以实现在不重新编译代码的前提下复用组件。 特点: 用 接口调用方式 解耦依赖&#xff1b…...

三、元器件的选型

前言:我们确立了题目的功能后,就可以开始元器件的选型,元器件的选型关乎到我们后面代码编写的一个难易。 一、主控的选择 主控的选择很大程度上决定我们后续使用的代码编译器,比如ESP32使用的是VScode,或者Arduino&a…...

在 Spring Boot 中使用 WebFilter:实现请求拦截、日志记录、跨域处理等通用逻辑!

💡 前言 在开发 Web 应用时,我们经常需要对所有请求进行统一处理,例如: 记录请求日志实现跨域(CORS)接口权限控制请求参数预处理防止 XSS 攻击 这些功能如果都写在每个 Controller 或 Service 里&#x…...

LlamaIndex 工作流简介以及基础工作流

什么是工作流? 工作流是一种由事件驱动、基于步骤的应用程序执行流程控制方式。 你的应用程序被划分为多个称为“步骤(Steps)”的部分,这些步骤由“事件(Events)”触发,并且它们自身也会发出事…...

App/uni-app 离线本地存储方案有哪些?最推荐的是哪种方案?

以下是 UniApp 离线本地存储方案的详细介绍及推荐方案分析: 一、UniApp 离线本地存储方案分类 1. 基于 uni.storage 系列 API(跨端基础方案) API 及特点: 提供 uni.setStorage(异步存储)、uni.getStorag…...

视频的分片上传,断点上传

​ 上传功能的实现,点击上传按钮,判断添加的文件是否符合要求,如果符合把他放入文件列表中,并把他的状态设置为等待中,对于每个文件,把他们切分为chunksize大小的文件片段,再检查他的状态是否为…...

CSS 性能优化

目录 CSS 性能优化CSS 提高性能的方法1. 选择器优化1.1 选择器性能原则1.2 选择器优化示例 2. 重排(Reflow)和重绘(Repaint)优化2.1 重排和重绘的概念2.2 触发重排的操作2.3 触发重绘的操作2.4 优化重排和重绘的方法 3. 资源优化3…...

C++编程——关于比较器的使用

注&#xff1a; 简单记录一下C里比较器的构建&#xff0c;常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器&#xff1a; sort() 函数&#xff1a; vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...

自动化提示生成框架(AutoPrompt)

自动化提示生成框架(AutoPrompt) 一、核心创新点 自动化提示生成框架(AutoPrompt) 创新本质:提出基于梯度引导搜索的自动化提示生成方法,替代人工设计模板的传统模式。技术路径: 将提示视为可训练的离散token序列,通过优化提示向量(prompt embedding)搜索语义空间。利…...