首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何利用策略模式避免冗长 if-elseswitch 分支判断代码?

本篇我们讲解策略模式原理和实现,以及如何用它来避免分支判断逻辑。后续我会通过一个具体例子,来详细讲解策略模式应用场景以及真正设计意图。...策略定义 策略类定义比较简单,包含一个策略接口和一组实现这个接口策略类。因为所有的策略类都实现相同接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同策略。...相反,如果策略类是有状态,根据业务场景需要,我们希望每次从工厂方法中,获得都是新创建策略对象,而不是缓存好可共享策略对象,那我们就需要按照如下方式来实现策略工厂类。...我们使用策略模式对上面的代码重构,将不同类型订单打折策略设计成策略类,并由工厂类来负责创建策略对象。具体代码如下所示: 重构之后代码就没有了 if-else 分支判断语句了。...策略模式包含一组策略可选,客户端代码如何选择使用哪个策略,有两种确定方法:编译时静态确定和运行时动态确定。其中,“运行时动态确定”才是策略模式最典型应用场景。

59051

FPGA 重构

FPGA重构有两种类型:完全和部分。完全重构将整个FPGA重新编程,而部分重构只取代设计一部分,设计剩下部分仍正常工作。部分重构不被视为完全重构特殊情况,因为两者基本相同。...对FPGA执行部分重构通过使用与完全重构(JTAG、CAP或SelectMAP接口)相同方法来进行,如上一节所述。比特流结构对于完全和部分重构来说都是相同。 FPGA重构具有以下几个优点。...利用FPGA重构优势一些应用DSP音频或视频处理器等,它们根据用户输人,由包括集成深度包检测通信控制器修改处理算法,以改变基于协议数据包处理器。...有三个部分重构流程可用于Xilinx FPGA基于差异(difference based)、基于分层(partition based)及使用动态重构端口。...动态重构端口 改变Xilinx GTX收发器、混合模式时钟管理器(MMCM)和System Monitor原语设置另一种方法,是使用动态重构端口(DRP)DRP提供了一个简单用户逻辑接口,不需要更多地了解配置寄存器和比特流结构

83620
您找到你想要的搜索结果了吗?
是的
没有找到

如何利用策略模式避免冗长if-elseswitch分支判断代码?

本篇我们讲解策略模式原理和实现,以及如何用它来避免分支判断逻辑。后续我会通过一个具体例子,来详细讲解策略模式应用场景以及真正设计意图。...可以先阅读下面一篇文章加快对策略模式理解 设计模式行为型:策略模式(StrategyPattern) 接下来,我就详细讲讲一个完整策略模式应该包含三个部分。...02 策略定义 策略类定义比较简单,包含一个策略接口和一组实现这个接口策略类。因为所有的策略类都实现相同接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同策略。...我们使用策略模式对上面的代码重构,将不同类型订单打折策略设计成策略类,并由工厂类来负责创建策略对象。具体代码如下所示: ? ‍‍‍‍‍‍重构之后代码就没有了 if-else 分支判断语句了。...策略模式可以使算法变化独立于使用它们客户端(这里客户端代指使用算法代码)。策略模式用来解耦策略定义、创建、使用。实际上,一个完整策略模式就是由这三个部分组成

86360

面向对象设计设计模式(十五):责任链模式

如果一个对象不能处理该请求,那么它会把相同请求传给下一个接收者,依此类推。 适用场景 在处理某个请求时候,解决策略因条件不同而不同。...这样做好处是,如果以后修改面值或添加一种新面值,我们只需要修改其中某一个处理者或者新建一个处理者类,再重新插入到责任链合适位置即可。 下面我们看一下如何用代码来模拟该场景。...我们回去看一下这三个具体处理者在dispense:方法处理是非常相似的,他们区别只有处理面额数值不同:而我们其实是创建了针对这三个面值类,并将面值(50,20,10)硬编码在了这三个类中。...下面看一下上面代码对应类图。 代码对应类图 重构前: ? 责任链模式代码示例类图一 重构后: ?...责任链模式代码示例类图二 优点 处理者之间责任分离,处理者只要处理好自己逻辑即可 方便修改每个处理者处理逻辑,也方便删除或者添加处理者,或者改变责任链中处理者顺序。

49130

提着代码跑路了!

对于逻辑混乱代码,如在循环中随意使用 break,复杂 if 语句嵌套等,你要做是理清逻辑重构代码,而不是让注释替你补锅。...选择一种,所有的命名都按照这个规则,并将其作为编码规范一部分,让团队成员都要遵守。 二、重构进阶 1、模块化重复代码 当你发现相同代码块在三个地方都出现时,你就需要考虑重构代码了。...对于同一个类中重复代码块,可使用提取方法(extract method:将重复代码提取出单独函数)来完成;对于一组相关类父类、子类 A、子类 B 中重复函数,通过上移方法(pull method...函数参数最多有三个是合理,超过三个就需要提高警惕了。...重构方法是:根据逻辑拆分函数;引入参数对象(parameter object:构造参数类,将原来传递参数作为类属性,调用方传入该类一个对象) 3、去掉多余变量 当定义变量没太多含义,而且没有赋值操作

41820

如何优化冗长条件语句

针对这种恶心if/else分支,我们当然首先想到重构它--在不改变代码外部功能特征前提下对代码内部逻辑进行调整和优化, 而且《重构》一书上有讲到这个问题。...【2】字典逻辑对应转化作用。 【3】用多态替代条件语句 【4】策略模式,继承重写,抽象父类和统一接口入口。...三、 用多态替代条件语句 使用多态场景 当对象要根据不同状态表现不同行为时。 当你需要在很多地方检查相同条件时。...策略模式使用就是面向对象继承和多态机制,由三个角色构成 1、Rescue封装角色 也叫上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法直接访问、封装可能存在变化。...多态性定义是:同一操作作用于不同实例,将产生不同执行结果,即不同类对象收到相同消息时,得到不同结果。多态是面向对象程序设计重要特征之一,是扩展性在“继承”之后又一重大表现 。

1.3K10

一秒钟一句话生成 PowerBI 数据字典并与同事分享

重构,顾名思义,就是:重新构建,说白了,就是重新做一遍。 为什么要重新做一遍呢? 重新做一遍底层逻辑就是:超越上一个版本自己。 因此,重构是一种重要思想。...重构,是一种反思,它总是提醒我们进行反思,一件事情是不是可以做得更好。 大家还记得爱因斯坦用纸做小板凳故事,做了三个版本,拿出了最好一个。...这里重构,除了超过上一个版本意思,还有一层更重要底层逻辑是: 怎么才算 “更好” 呢?...第一次重构:解除名称硬编码 任何用 "" 写出文本都存在不够通用问题,因此,需要将硬编码部分提取,以便未来需求变化时,在一个位置维护变化内容。...第二次重构:应对复杂工程 我们刚刚截图非常简单,如下: 现在问题是,如果面对是一个大型复杂工程,还可以吗? 第一步:先从业务逻辑上想想,有没有这个需求?

2.6K20

开发一个可维护程序

晚上回家时候跟同事聊起来一些编程工具。主要是三个东西「MVC」「Gitflow」和「unittest」。最近开发一个程序正好这三个都在用,深感对于开发出一个可维护程序来说这三者重要。...Model 是数据模型,业务逻辑和业务规则,一般成品后不会改变,比如博客里文章,注意发布、回收、评论等虽然也是对数据操作,但也被归到 model 里面,一般表现为类方法。...Controller 是 Model 和 View 中间层,Model 不会输出任何用于表现东西, HTML 代码等,view 也不会对 model 有任何操作,controller 决定使用哪些...Model 主要是保存事物信息,数据,行为,方法是 model 主要内容,Model所提供数据都是原始数据。也就是说,不带有任何表现层代码。 注意与Controller区分开。...如果要重构,完成或放弃还在做 feature 分支。 unittest 是什么? 单元测试是一堆测试断言,用来测试程序接口有没有问题。 为什么要用 unittest?

54540

网络研讨会视频:重构还是重写?聊聊 Java 代码臭味与重构技巧

本次网路研讨会特别邀请到 Odd-e 敏捷教练张博超(Jackson)为大家演示如何用 IntelliJ IDEA 重构功能来改善 Java 代码臭味。...为了让大家具体体现重构过程,张博超以一个计算预算代码为例子,实际以 IntelliJ IDEA 演示该怎么综合运用提取变量、提取方法、提取类、引入参数对象、修改构造函数等重构功能安全地修改代码,将一个原本高达...让代码更简洁、有更好表达能力、未来更好维护。在重构过程中,张博超还提醒我们务必每重构一步,就自动化运行单元测试,快速验证目前重构工作是否有改动到原有代码逻辑。...对老系统利用新语言特性进行重构时会产生难以调和矛盾, Lambda Function 中无法优雅 Exception Handling,请教老师如何解决这样问题呢?...参数多时候提取参数对象,导致方法 get 方法超过,是因为没有重构完吗? 这背后隐藏问题可能是有很多数据簇,通过这些组合出一个很大概念。

69810

代码重构新手教程:如何将烂代码变成好代码?

对于逻辑混乱代码,如在循环中随意使用 break,复杂 if 语句嵌套等,你要做是理清逻辑重构代码,而不是让注释替你补锅。...常量命名 常量命名除了要遵守上一小节提到通用方法外,还有一类魔法数字(magical numbers)情况,使用 0,1 来代表男女。...让我们下面关注一些稍微复杂重构内容。 1. 重复代码 当你发现相同代码块在三个地方都出现时,你就需要考虑重构代码了。...对于同一个类中重复代码块,可使用提取方法(extract method:将重复代码提取出单独函数)来完成;对于一组相关类父类、子类 A、子类 B 中重复函数,通过上移方法(pull method...重构方法是:根据逻辑拆分函数;引入参数对象(parameter object:构造参数类,将原来传递参数作为类属性,调用方传入该类一个对象) 3.

55720

前端底层构建工具重构之路——IMFLOW架构升级文档

重构模式 业界常用复杂系统重构方法有三种模式:拆迁者模式、绞杀者模式和修缮者模式三种,首先结合业务分析一下各个模式利弊。 3.1.1....重构内容 升级目标所述,我们需要将既有的几个构建工具 IMFLOW、IMFLOW-SCF 和 IMFLOW-LIB 整合为一套系统,将各个构建工具重构为构建套件,每个构建套件有业务强相关构建相关指令... create、dev 和 build 等等,各个构建套件以插件逻辑加载到新架构 IMFLOW-CORE 中,如下图: 这部分内容比较好理解,下文我想用逼人空想出哪吒模型通俗讲解新架构重构:整个重构可以想象成把三个泥人捏成一个哪吒...截止到这我们其实已经明确了将几个小泥人重构成一个哪吒所需要工作(对应重构目标): 脏器:一套,新架构核心 CORE,提炼公共核心模块,封装对外暴露各种方法,收拢配置和依赖。...imflow.config.js", "imtrc.js", "package.json"], cwd: baseDir, packageKey: "imflow" }); 三者指令注册方法在底层是相同

63110

「首席架构师看敏捷数据」数据库重构:适应业务快速变化

您在A Vision中了解到敏捷数据方法,敏捷方法极限编程(XP)和纪律敏捷交付(DAD))采用迭代和增量方法进行软件开发。...对于许多有经验IT专业人员来说,这是一种非常不同工作方 这意味着,预先创建(几乎)完整逻辑和物理数据模型集传统方法不会起作用。...在我们示例中,这将包括任何用于提高ZipCode列中值质量代码。 4.1.7更新外部程序 访问要重构数据库模式部分程序必须更新才能使用新版本数据库模式。...由于数据库重构是敏捷数据方法一种支持技术,因此采用数据库重构许多文化问题与采用敏捷数据方法时面临问题相同。这些文化问题包括许多数据专业人员一系列思维方式,对变革抵制以及政治惰性。...对文件需求反映了重构必要性。 经常测试。 7.现实世界中数据库重构 数据库重构支持数据库模式演变渐进方法,这是三个基本策略之一(您可以放弃,采取“大爆炸”方法,采取增量方法)。

94320

高级 PHP 工程师必备编码技巧及思维

本文,我将向你展示一些现实生活中技巧和想法例子,来帮助你清理你逻辑代码,重构它,让它变得更健壮和模块化。这些技巧将不仅仅帮助你重构旧代码,而且给你一些如何从现在开始写出简洁代码好建议。...下面的内容将向你展示一些重构逻辑代码,让它变得更好例子。 不要在没有单元测试情况下重构生产环境代码 我第一条建议是从不在没有完全进行单元测试情况下开始重构逻辑代码。...示例:从底层开始重构 你看这个代码,这里用红色标出了三个层级。最底层应该是在第一个 if 条件下被 if/else 包围申明。通常,最底层是集中在单一逻辑处理,比较容易重构。...示例:修复魔术数字 不要使用 else 申明,如果你不是真的需要: 在相同 availablerooms () 函数中,你注意到那个 if 申明, 其中我们可以很容易摆脱 else 部分,而且逻辑保持一致...很多功能能够节约你们时间,而且能够让你们代码更健壮。看下下面的示例,注意如何在更少代码情况下更容易达到相同结果,通过使用类型提示。

80660

何用原生 DOM API 生成表格

回到基础:如何用原生 DOM API 生成表格 这是一个刷 JavaScript 经验值好机会:在技术面试中出现最多一个问题就是**怎样用原生 API 操作 DOM **。..." }, 3 // 4]; 然后用得到 key 生成三个表头。...也就是说通过以上逻辑可以填充我们表。打开 build-table.js 并创建一个名为 generateTable 新函数。...到此为止,你应该能够在不依赖任何外部库情况下操作HTML表了。恭喜! 总结 在本教程中,我们学到了如何用原生 JavaScript 生成表格。...我们有一些带有全局绑定代码(请参阅执行上下文和调用堆栈以获取更多信息)。在下一篇文章中,我们将看到怎样重构这些代码。 jQuery正逐渐消失。

1.9K20

代码重构(四):条件表达式重构规则

如果处理不好的话,代码看上去会非常糟糕,而且业务逻辑看上去会非常混乱。今天就通过一些重构规则来对条件表达式进行重构,让业务逻辑更为清晰,代码更以维护和扩展。...在上述夸张Demo中一眼就能看出来如何进行重构了(在日常开发迭代中,因为业务逻辑复杂性或者多次迭代原因,往往不是那么一目了然)。接下来我们就要对不同条件,但返回相同结果部分进行合并。...在开发中是比较忌讳重复代码,如果出现重复代码,那么说明你代码应该被重构了。    下方代码片段中if与else中有着相同语句,就是这个print语句。...下方代码段就是对上述代码去除标记变量重构重构代码如下所示,当然还有好多其他去除方法,此处仅仅给出了一种。 ?...因为每个书籍价格中都会有相应计算方法,也就是charge()方法,所以我们为这三个书籍价格定义了一个协议(接口或者抽象类),在协议中就给出了charge()函数。

1.5K90

「峰会回响」小程序云开发持续交付和质量管控(下)

常规思路下,业务压力大,首先想到就是通过增加人力来缓解业务压力,但由于每个人代码风格不尽相同,人员增多也增加了代码管控难度。...而在重构方面,团队通过持续交付流水线、重构抑制效率损失,但反过来,也存在重构某些代码影响线上业务风险。...事实上,以上流程存在一定隐患,以小程序底层架构为例,相信对小程序开发熟悉同学非常了解,图中逻辑层和渲染层是分离,也即逻辑层无法拿到渲染层结果,没有办法对渲染层进行监控。...由此我们就只需关心本次变更是否有影响到这一块逻辑,如果有的话,需要及时排查问题。 这里就是刚才讲到质量管控总体思路,是分为事前、事中和事后三个阶段进行。...本次分享内容主要集中在如何用云开发提升效能,包括持续构建、持续发布 ABTest 方面,而在质量方面,我们也会有灰度发布、自动化测试以及 UI 自动截屏,另外,使用云开发过程中也运用到了微信私有链路

59620

一个完整TDD演练案例(三)

判断猜测次数,如果满6次但是未猜对则判负;如果在6次内猜测4个数字值与位置都正确,则判胜 ? 开始第三个任务 之所以将“验证输入是否合法”放在第三个任务,是因为它不属于happy path范畴。...多数人会认为这里验证逻辑与Answer相关,根据前面提到“信息专家模式”,似乎应该将验证逻辑放到Answer中。...针对第三个任务,验证结果逻辑不应该由boolean型或错误码来表现。...重构:Answer验证逻辑 在开发第二个任务时,我们已经在Answer类中定义了validate()方法。...现在,InputValidator类又提供了validate()方法,且其中部分逻辑相同。在实现时,应该如何重构现有代码?

87870

深入理解简单设计

¶ 简单设计量化标准 在满足需求基本前提下,简单设计其实为代码重构给出了三个量化标准: 重复性 可读性 简单性 重复性是一个客观标准,可读性则出于主观判断,故而应优先考虑尽可能消除代码重复,...Robert Martin在书中给出了对源代码三个重构版本,这三个版本演化恰好可以帮助我们理解简单设计原则。...与其封装一个用超长名称才能表达其意图includeSetupAndTeardownPages()方法,不如直接“敞开”相同层次代码细节,: includeSuiteSetupPage(testPage...当提取方法逻辑层次嵌套太多,彼此职责又高内聚时,就需要考虑将这个主方法和提取出来方法一起委派到一个专门类。...对比Robert Martin给出重构第二个版本以及这个提取类最终版本,我赞成将该主方法逻辑提取给专门类,但不赞成在主方法中定义过度抽象层次includeSetupAndTeardownPages

26330

如何 “干掉” if...else

其中只列出5个逻辑分支,但实际工作中,能见到一个方法包含10个、20个甚至更多逻辑分支情况。另外,if...else 过多通常会伴随着另两个问题:逻辑表达式复杂和 if...else 嵌套过深。...方法四:事件驱动 介绍 通过关联不同事件类型和对应处理机制,来实现复杂逻辑,同时达到解耦目的。...一般来说,当一个类中多个方法都有类似于示例中 if...else 判断,且条件相同,那就可以考虑使用多态方式消除 if...else。 同时,使用多态也不是彻底消除 if...else。...比如,在《重构与模式》一书中就介绍了“用 Strategy 替换条件逻辑”、“用 State 替换状态改变条件语句”和“用 Command 替换条件调度程序”这三个方法。...总结 本文一个介绍了10种(算上扩展有12种)用于消除、简化 if...else 方法。还有一些方法通过策略模式、状态模式等手段消除 if...else 在《重构与模式》一书中也有介绍。

88620

如何解决代码中 if…else 过多问题?

其中只列出5个逻辑分支,但实际工作中,能见到一个方法包含10个、20个甚至更多逻辑分支情况。另外,if...else 过多通常会伴随着另两个问题:逻辑表达式复杂和 if...else 嵌套过深。...方法四:事件驱动 介绍 通过关联不同事件类型和对应处理机制,来实现复杂逻辑,同时达到解耦目的。...一般来说,当一个类中多个方法都有类似于示例中 if...else 判断,且条件相同,那就可以考虑使用多态方式消除 if...else。 同时,使用多态也不是彻底消除 if...else。...比如,在《重构与模式》一书中就介绍了“用 Strategy 替换条件逻辑”、“用 State 替换状态改变条件语句”和“用 Command 替换条件调度程序”这三个方法。...总结 本文一个介绍了10种(算上扩展有12种)用于消除、简化 if...else 方法。还有一些方法通过策略模式、状态模式等手段消除 if...else 在《重构与模式》一书中也有介绍。

2.1K20
领券