关于if:CTO再写ifelse逮着罚款1000

4次阅读

共计 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 万 + 码农成长充电第一站,陪有幻想的你一起成长

正文完
 0