共计 1991 个字符,预计需要花费 5 分钟才能阅读完成。
本文并不必定或者否定哪一种写法,仅仅为大家提供一些其余的编码思路或者一些值得借鉴的点子。
设计更好的软件,替换 If-Else 的 5 种办法,从入门到高级示例
If-Else 通常是一个蹩脚的抉择,它导致设计简单,代码可读性差,并且可能导致重构艰难。
然而,If-Else 已成为事实上的代码分支解决方案,这的确是有情理的。这是向所有有抱负的开发人员讲授的第一件事。
可怜的是,许多开发人员素来没有后退到更适合的分支策略。有些人的口头禅是:If-Else 是一把锤子,一切都是钉子。
我将向大家展现一些技巧和模式,这些技巧和模式将终结这种可怕的做法。每个示例的难度都会减少。
齐全不必要的 Else 块
这兴许是那些高级开发人员最负罪的之一。上面的示例很好地阐明了当你被认为 If-Else 很棒时会产生什么:
Simple if-else
只需删除 else` 块即可简化此过程,如下图:
Removed else
看起来更业余吧?你会发现,实际上基本不须要其余块。像在这种状况下一样,你想要在满足特定条件的状况下执行某些操作并立刻返回。
价值调配
如果你要依据提供的某些输出为变量调配新值,请进行 If-Else 废话,一种更具可读性的办法。
Value assignment with if-else
只管很简略,但它却很蹩脚。首先,If-Else 很容易在这里被开关取代。然而,咱们能够通过齐全删除 else 来进一步简化此代码。
If statements with fast return
如果不应用 else,则咱们将剩下洁净的可读代码。请留神,我也将款式更改为疾速返回而不是单返回语句。如果曾经找到正确的值,持续测试一个值基本没有意义。
前提条件查看
通常,我发现,如果办法提供了有效的值,则继续执行是没有意义的。假如咱们从以前就有了 DefineGender 办法,要求提供的输出值必须始终为 0 或 1。
Method without value checks
在没有价值验证的状况下执行该办法没有任何意义。因而,在容许办法继续执行之前,咱们须要查看一些先决条件。
利用爱护子句防御性编码技术,你将查看办法的输出值,而后继续执行办法。
Check preconditions with guard clauses
至此,咱们确保仅在值落在预期范畴内时才执行主逻辑。当初,IF 也已被三元代替,因为不再须要在结尾处默认返回 ” 未知 ”。
将 If-Else 转换为字典,完全避免 If-Else
假如您须要执行一些操作,这些操作将依据某些条件进行抉择,咱们晓得当前必须增加更多操作。
兴许有人偏向于应用久经考验的 If-Else。如果增加新操作,则只需简略地增加其余内容即可。很简略 然而,就保护而言,这种办法不是一个好的设计。
晓得咱们当前须要增加新的操作后,咱们能够将 If-Else 重构为字典。
可读性已大大提高,并且能够更轻松地推断出该代码。留神,仅出于阐明目标将字典搁置在办法外部。您可能心愿从其余中央提供它。
扩大应用程序,完全避免应用 If-Else
这是一个略微高级的示例。通过用对象替换它们,晓得何时甚至齐全打消 If。
通常,您会发现自己不得不扩大应用程序的某些局部。作为高级开发人员,您可能会偏向于通过增加额定的 If-Else(即 else-if)语句来做到这一点。
举这个说明性的例子。在这里,咱们须要将 Order 实例显示为字符串。首先,咱们只有两种字符串示意模式:JSON 和纯文本。
在此阶段应用 If-Else 并不是什么大问题,如果咱们能够轻松替换其余,只有如前所述即可。
晓得咱们须要扩大应用程序的这一部分,这种办法相对是不可承受的。
下面的代码不仅违反了 ” 关上 / 敞开 ” 准则,而且浏览得不好,还会引起可维护性方面的麻烦。
正确的办法是遵循 SOLID 准则的办法,咱们通过施行动静类型发现过程(在本例中为策略模式)来做到这一点。
重构这个凌乱的过程的过程如下:
- 应用公共接口将每个分支提取到独自的策略类中。
- 动静查找实现通用接口的所有类。
- 依据输出决定执行哪种策略。
替换下面示例的代码如下所示。是的,这是更多代码的形式。它要求您理解类型发现的工作原理。然而动静扩大应用程序是一个高级主题。
我只显示将替换 If-Else 示例的确切局部。如果要查看所有波及的对象,请查看此要点。
让咱们疾速浏览一下代码。办法签名放弃不变,因为调用者不须要理解咱们的重构。
首先,获取实现通用接口 IOrderOutputStrategy 的程序集中的所有类型。而后,咱们建设一个字典,格式化程序的 displayName 的名称为 key,类型为 value。
而后从字典中抉择格式化程序类型,而后尝试实例化策略对象。最初,调用策略对象的 ConvertOrderToString。
欢送关注我的微信公众号「码农解围」,分享 Python、Java、大数据、机器学习、人工智能等技术,关注码农技术晋升•职场解围•思维跃迁,20 万 + 码农成长充电第一站,陪有幻想的你一起成长