当前位置: 首页 > 科技观察

摆脱if-else,多套路,少走弯路!

时间:2023-03-21 22:27:06 科技观察

您可能看过无数关于使用if-else语句的教程,并且您可能读过不少将if-else用作事实上的分支技术的编程书籍。ImageviaPexels这可能是你每天的默认编码模式。但是让我们今天结束这种方法并用状态对象替换If-else。请注意,如果您正在编写需要根据当前状态更改其实现类的代码,则需要改用这种方法。如果您的代码不处理对象状态更改,则需要选择另一种方法。即使您听说过状态模式,您也可能想知道如何在生产代码中实现它。对于那些之前不太了解的人,这里有一个非常简单的介绍。向if-else添加任何新条件都会增加复杂性。应用状态模式,您只需使用专门的状态对象而不是if-else语句来更改对象的行为。像这样的代码时代已经一去不复返了:警告:PTSD触发器。此外,希望您能发现其中的逻辑错误(除了代码的整体混乱之外)。您之前一定写过更复杂的分支。几年前我确实写过它。虽然上面的分支逻辑不是很复杂,但是如果加入新的条件,逻辑会更加混乱。此外,如果您认为创建新类而不是简单地使用分支语句听起来很烦人,那么请继续查看下面的实际代码,它干净而优雅。更好的是,它会让你的代码库变得可靠,除了“D”部分。“好吧,我相信if-else是邪恶的,现在告诉我如何避免混乱的分支代码”!我们将看到如何替换生产代码中的if-else分支。这是一个假设的例子,但我在一个大客户的代码库中使用的方法是一样的。让我们创建一个包含几个状态的非常简单的Booking类。它还将有两个公共方法:Accept()和Cancel()。我画了一张图,显示了预订可能处于的不同状态:从代码中重构分支逻辑可以分为三个步骤:创建一个抽象基状态类。将每个状态实现为一个单独的类,继承自基本状态。让Booking类有一个私有或内部方法,将状态基类作为参数。演示时间首先,我们需要一个基础状态类,所有状态都从中继承。请注意,此基类还有两个方法,Accept和Cancel,尽管此处将它们标记为内部方法。此外,基本状态有一个特殊的EnterState(Bookingbooking)方法。只要将新状态分配给订阅对象,就会调用此方法。其次,我们必须为每个要表示的状态创建一个单独的类。请注意每个类如何表示一个状态,如上图所示。此外,CancelledState将不允许订阅转换到新状态。这个类的设计与空对象模式非常相似。最后,看看Booking类本身:看看Booking类如何简单地将Accept和Cancel的实现委托给它的状态对象?这样做可以让我们去掉很多条件逻辑,让每个状态只关注它自己的重要内容——当前状态,以及将订阅转换到新状态的可能性。如何处理新的条件功能?如果新功能通常会通过一些条件检查来实现,那么现在您可以直接创建一个新的状态类。就这么简单。您将不再需要处理笨重的if-else语句。如何将状态对象持久化到数据库中?不需要。将对象保存到SQL或NoSQL数据库时,对象的状态无关紧要。唯一重要的是了解对象的状态,以及如何将其映射到列。您可以将状态映射到友好的类型名称、枚举或整数。只要您有办法将保存的值转换回状态对象,那么任何事情都可以。但是为什么你还在用if呢?是的,if有时是必要的,尤其是用作保护条款时。if-else组合是可维护性问题的根本原因。但是文中描述的方法会带来很多额外的类吗?的确。正如我在另一篇文章中提到的,复杂性并非源于您拥有的类的数量,而是源于这些类的职责。拥有大量专门的类可以使您的代码库更具可读性、可维护性,并且总体上更讨人喜欢。作者:NicklasMillard编辑:陶佳龙来源:转载自公众号高可用架构(ID:ArchNotes)