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

Statepattern无需If-Else语句也能写出干净可维护的代码

时间:2023-03-18 22:04:51 科技观察

If-Else语句对我们来说再熟悉不过了,你可能已经看过无数关于它们的教程,也阅读了大量的编程书籍来提高使用If-Else作为事实上的分支技术,甚至可能您的默认模式是使用If-Else。是时候结束这一切了。使用If-Else会增加任何新条件要求的复杂性。使用状态对象而不是If-Else。应用状态模式,您只需要使用专用的状态对象,而无需使用If-Else语句来改变对象的行为。像下面这样的代码的日子已经一去不复返了:触发PTSD警告你一定曾经写过更复杂的分支,我也这样做了。上面的分支逻辑甚至不是很复杂,但是如果你尝试添加新的条件,事情肯定会变得更糟。另外,如果您认为创建新类而不是简单地使用分支语句听起来很烦人,请务必等到您实际使用它时,您会发现这种方法简单而优雅。除了“D”部分,它也会让你的代码库更加扎实。那么如何避免混乱的分支代码呢?我们将研究如何替换生产就绪代码中的If-Else分支。这是一个人为的示例,但方法与我在大型客户的代码库中使用的方法相同。创建一个带有一些状态的非常简单的Booking类。它还有两个公共方法:Accept()和Cancel()。我尽力画了一个图表来显示预订可能处于的不同状态。重构代码中的分支逻辑的过程分为三个步骤:创建一个抽象基类将每个状态实现为一个单独的类,继承自基本状态让Booking`类有一个私有或内部方法,将状态基类作为参数演示时间到了!首先,您需要一个基类,所有状态都将从该基类继承。请注意,基类也有两个方法,Accept和Cancel-尽管它们在这里标记为internal。此外,基本状态有一个“特殊”的EnterState(Bookingbooking)方法。只要将新状态分配给订阅对象,就会调用此方法。其次,为您要表示的每个状态创建单独的类。请注意每个类如何表示一个状态,如上图所示。此外,ExpiredState和CancelledState不会将订阅转换为新状态。这两个类别在本质上与空对象模式非常相似。最后,预订类型本身。看看预订类型如何简单地将Accept和Cancel的实现委托给它的状态对象?这样做可以让我们去掉很多条件逻辑,让每个状态只关注对自己重要的事情,当前状态也有机会将预留转换分配给新状态。问答1。如何处理新的条件函数?如果你平时需要使用一些条件检查来实现新的功能,现在你只需要新建一个状态类,你将不再需要处理if-else语句。2.你如何在数据库中持久化状态对象?不,你不知道。将对象保存到例如对于SQL或NoSQL数据库,对象的状态并不重要,重要的是知道对象的状态以及它应该如何映射到列。您可以将状态映射到友好的类型名称、枚举或整数。总有一些方法可以随时将保存的值转换回状态对象。3.但是你还在用If吗?它们是必不可少的,尤其是用作保护条款时。但是If-Else组合是可维护性头痛的根本原因。资料来源:Unsplash复杂性并非源于您拥有的类的数量,而是源于这些类承担的功能。拥有许多专门的类将使您的代码库更具可读性、可维护性,并且通常更易于使用。在适当的时候告别If-Else语句!