记录--卸下if-else 侠的皮衣!- 策略模式

news2024/12/23 0:10:10

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

🤭当我是if-else侠的时候

😶怕出错

给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面增加逻辑,生怕搞错,要是涉及到支付功能,分分钟炸锅

😑难调试

我总是不知道之前写的逻辑在哪里,一个方法几百行逻辑,而且是不同功能点冗余在一起!这可能让我牺牲大量时间在这查找调试中

🤨交接容易挨打

当你交接给新同事的时候,这个要做好新同事的白眼和嘲讽,这代码简直是坨翔!这代码简直是个易碎的玻璃,一碰就碎!这代码简直是个世界十大奇迹!

🤔脱下if-else侠的皮衣

先学习下开发的设计原则

单一职责原则(SRP)

就一个类而言,应该仅有一个引起他变化的原因

开放封闭原则(ASD)

类、模块、函数等等应该是可以扩展的,但是不可以修改的

里氏替换原则(LSP)

所有引用基类的地方必须透明地使用其子类的对象

依赖倒置原则(DIP)

高层模块不应该依赖底层模块

迪米特原则(LOD)

一个软件实体应当尽可能的少与其他实体发生相互作用

接口隔离原则(ISP)

一个类对另一个类的依赖应该建立在最小的接口上

在学习下设计模式

大致可以分三大类:创建型结构型行为型
创建型:工厂模式 ,单例模式,原型模式
结构型:装饰器模式,适配器模式,代理模式
行为型:策略模式,状态模式,观察者模式

为了尽快脱掉这个if-else的皮衣,我们就先学习一种比较容易接受的设计模型:策略模式

策略模式

举个例子

  • 当购物类型为“苹果”时,满 100 - 20,不满 100 打 9 折
  • 当购物类型为“香蕉”时,满 100 - 30,不满 100 打 8 折
  • 当购物类型为“葡萄”时,满 200 - 50,不叠加
  • 当购物类型为“梨”时,直接打 5 折
    然后你根据传入的类型和金额,写一个通用逻辑出来, 当我是if-else侠的时候,我估计会这样写:
funcion getPrice(type,money)
  //处理苹果
   if(type == 'apple'){
     if(money >= 100){
       return money - 20
     }
     return money * 0.9
   }
  //处理香蕉
    if(type == 'banana'){
     if(money >= 100){
       return money - 30
     }
     return money * 0.8
   }
  //处理葡萄
    if(type == 'grape'){
     if(money >= 200){
       return money - 50
     }
     return money
   }
  //处理梨
    if(type == 'pear'){
       return money * 0.5
   }
}

然后我们开始来分析问题:\

  1. 违反了单一职责原则(SRP)
    一个方法里面处理了四个逻辑,要是里面的哪个代码块出事了,调试起来也麻烦
  2. 违反了开放封闭原则(ASD)
    假如我们要增加多一种水果的逻辑,就又要在这个方法中修改,然后你修改完这个方法,就跟测试说,我在这个方法增加了多一个种水果,可能要重新回归这个方法,那你看测试增加了多少工作量

改造考虑:消灭if-else, 支持扩展但是不影响原本功能!

const fruitsPrice = {
  apple(money){
   if(money >= 100){
       return money - 20
     }
     return money * 0.9
  },
  banana(money){
      if(money >= 100){
       return money - 30
     }
     return money * 0.8
  },
  grape(money){
   if(money >= 200){
       return money - 50
     }
     return money
  },
  pear(money){
   return money * 0.5
  }
}

首先定义一个fruitPrice对象,里面都是各种水果价格的映射关系
然后我们调用的时候可以这样

function getPrice(type,money){
  return fruitsPrice[type](money)
}

当我们要扩展新水果的时候

fruitsPrice.orange = function(money){
   return money*0.4
}

综上所述: 用策略模式重构这个原本的逻辑,方便扩展,调试,清晰简明,当然这只是一个模式重构的情况,可能还有更优的情况,靠大家摸索

本文转载于:

https://juejin.cn/post/7239267216805871671

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

索引使用——单列索引、联合索引、索引设计原则

1.单例索引和联合索引 尽量使用联合索引,避免使用单列索引,因为使用联合索引性能相对而言会比较高,如果联合索引使用得当,可以避免回表查询,使用单列索引很容易造成回表查询的情况,造成性能降低。 create…

双Bank OTA升级:N32L40X BootLoader (一)

什么是双Bank升级:将Flash划分为以下4个区域。 BootLoader区:程序进行升级的引导程序,根据Upade_Flag来判断程序是跳转Bank1区运行程序或是将Bank2区的程序搬运到Bank1区,然后在运行程序。 Upade_Flag区:判断BootLoa…

OpenCV自带的HAAR级联分类器对脸部(人脸、猫脸等)的检测识别

在计算机视觉领域,检测人脸等是一种很常见且非常重要的应用,我们可以先通过开放计算机视觉库OpenCV来熟悉这个人脸识别领域。另外OpenCV关于颜色的识别,可以查阅:OpenCV的HSV颜色空间在无人车中颜色识别的应用HSV颜色识别的跟踪实…

WAIC2023:图像内容安全黑科技助力可信AI发展

目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束,恰逢全球大模型和生成式人工智能蓬勃兴起之时,今年参…

MQTT 与 Kafka|物联网消息与流数据集成实践

MQTT 如何与 Kafka 一起使用? MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台,旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物…

模拟实现atoi函数

请记住那些对你好的人,因为他们本可以不这么做 文章目录 atoi函数介绍 模拟实现 大家好,我是纪宁。 atoi函数,它的功能是将数字字符转化为数字。我第一次见这个函数还是在大一上在刷蓝桥杯的时候,有一个关于回文数字的题&#x…

08.计算机网络——其他重要协议和技术

文章目录 DNSICMPNAT代理服务器 DNS DNS是一整套从域名映射到IP的系统 ​ TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,于是人们发明域名,其本质是一个字符串,映射了它和IP地址的关系。 …

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)-附代码

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES) 文章目录 融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)1.秃鹰优化算法2.改进秃鹰优化算法2.1 基于纵横交叉策略2.2 基于惯性权重的位置更新2.3 黄金正弦捕食机制 3.实验结果4.参考文献5.Matlab代码6.python代码…

FreeRTOS-列表和列表项

列表和列表项: 列表是FreeRTOS中的一个数据结构,用来跟踪FreeRTOS中的任务。 列表项就是存放在列表中的项目,属于列表的子集。 列表就相当于一个链表,列表项就相当于节点,在FreeRTOS中的列表是一个双向的环形链表。 …

基于FPGA的视频接口之PAL(NTSC)编码

简介 PAL又称帕尔制,是咱们中国早期视频所是使用的视频广播模式,基本上现在的电视都兼容这种视频模式,使用的接口也是传统的BNC插头,有兴趣的伙伴可以看看电视屁股后面是不是有一个单独的BNC接口,百分之98就是支持PAL格…

FastReport.Net FastReport.Core 2023.2.23 Crack

FastReport.Net & FastReport.Core 2023.2.23适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可用于 Microsoft Visual Studio 2022 和 JetBrains Rider。 利用数据呈现领域专家针对 .NET 7、.NET Core、Blazor、ASP.NET、MVC、Windo…

【Windows】cmd和powershell命令合集

文章目录 1 前言2 一些规则3 cmd命令合集4 bat语法学习5 powershell命令合集6 powershell语法学习 1 前言 在日常使用过程中,总是会遇到不记得或无法区分cmd命令和powershell命令的情况,因为在Windows的工作大部分都是可视化的鼠标点击,用到命…

CLH自旋锁原理

CLH自旋锁 JUC中显式锁基于AQS抽象队列同步器,而AQS是CLH锁的一个变种。 在争夺锁激烈的情况下,为了减少CAS空自旋(CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴),Java轻量级锁会升级为重量级锁&a…

大数据学习03-Hive分布式集群部署

系统环境:centos7 软件版本:jdk1.8、zookeeper3.4.8、hadoop2.8.5、hive1.1.0 一、安装 hive官网 下载hive安装包,上传到linux服务器上, 解压安装包 tar -zxvf apache-hive-1.1.0-bin.tar.gz -C /home/local/重命名文件 mv …

腾讯云轻量应用服务器搭建Typecho博客网站全流程

腾讯云轻量应用服务器自带Typecho应用模板镜像,腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统,并已预置Nginx、PHP、MariaDB软件程序,使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

C# 反转链表

206 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3…

Python中的标签编码和独热编码

在机器学习项目中,我们通常处理具有不同分类列的数据集,其中一些列的元素在有序变量类别中,例如列收入水平具有低,中或高的元素,在这种情况下,我们可以用1,2,3替换这些元素。其中1表…

【100天精通python】Day9:数据结构_字典、集合

目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中,字典(Dictionary)是一种无序的数据结构,用于存储键值对的集合。每个…

flask 读取文件夹文件,展示在页面,可以通过勾选删除

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import os import globapp Flask(__name__)app.route(/, methods[GET, POST]) def index():if request.method POST:to_delete request.form.getlist(checks)for file in to_delete…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理(类) 2、FilterChainProxy 过滤器链代理(类) 4、SecurityFilterChain 安全过滤器链(接口) 5、Security Filters 安全过滤器实例 6、Sp…