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

CTO:再写if-else,罚1000!

时间:2023-03-14 14:59:17 科技观察

图片来自Pexels设计更好的软件,替换If-Else的5种方法,从入门到高级示例结构很困难。然而,If-Else已成为事实上的代码分支解决方案,而且它确实有意义。这是教给所有有抱负的开发人员的第一件事。不幸的是,许多开发人员从未转向更合适的分支策略。有些人有一句口头禅:If-Else是锤子,一切都是钉子。我将向您展示一些技巧和模式,以结束这种可怕的做法。每个例子的难度都会增加。完全不必要的Else块这也许是那些初级开发人员最严重的罪恶感之一。下面的例子很好地说明了当你认为If-Else很棒时会发生什么:简单的if-else这个过程可以通过简单地删除else块来简化,如下图所示:删除else看起来更专业,对吧?你会发现其实其他的block根本就不需要。就像在这种情况下,您想做某事并在满足特定条件时立即返回。赋值如果您要根据提供的某些输入为变量分配新值,请停止If-Else废话,这是一种更具可读性的方法。用if-else赋值,尽管很简单,但很糟糕。首先,这里的If-Else很容易被switch替换。但是,我们可以通过完全删除else来进一步简化此代码。如果没有else的快速返回语句,我们将得到干净可读的代码。请注意,我还将样式更改为快速返回而不是单个返回语句。如果已经找到正确的值,则继续测试该值是没有意义的。先决条件检查通常,我发现如果一个方法提供了一个无效值,那么继续下去就没有意义了。假设我们有之前的DefineGender方法,它要求输入值必须始终为0或1。没有值检查的方法执行没有值检查的方法是没有意义的。因此,我们需要在允许方法继续之前检查一些先决条件。应用保护子句防御性编码技术,您将在继续执行方法之前检查方法的输入值。使用保护子句检查前提条件此时,我们确保仅在值落在预期范围内时才执行主要逻辑。IF现在也已被三元替换,因为不再需要最后默认返回“未知”。将If-Else转换为字典并完全避免If-Else,假设您需要执行一些将根据某些条件选择的操作,我们知道我们稍后必须添加更多操作。也许有人倾向于使用久经考验的If-Else。如果您添加新操作,您只需添加其他内容。简单的。但是,这种方法在维护方面并不是一个好的设计。知道我们稍后需要添加新操作,我们可以将If-Else重构为字典。可读性大大提高,代码更容易推理出来。请注意,字典放在方法内部仅用于说明目的。您可能希望从其他地方提供服务。扩展应用程序,完全避免If-Else这是一个稍微高级的示例。知道什么时候甚至可以通过用对象替换它们来完全消除If。通常,您会发现自己必须扩展应用程序的某些部分。作为初级开发人员,您可能会想通过添加额外的If-Else(又名else-if)语句来做到这一点。以这个说明性的例子为例。这里我们需要将Order实例显示为字符串。首先,我们只有两种字符串表示形式:JSON和纯文本。这个阶段使用If-Else没什么大不了的,如果我们可以很容易的替换掉其他的,只要像前面说的那样就可以了。知道我们需要对这部分应用程序进行伸缩,这种做法肯定是不行的。上面的代码不仅违反了“开放/封闭”原则,读起来也不好,而且会导致令人头疼的可维护性问题。正确的方法是遵循SOLID原则,我们通过实施动态类型发现过程(在本例中为策略模式)来做到这一点。重构这个烂摊子的过程如下:将每个分支提取到一个具有公共接口的单独策略类中。动态查找实现通用接口的所有类。根据输入决定执行哪种策略。替换上述示例的代码如下所示。是的,这是更多的代码。它要求您了解类型发现的工作原理。但动态扩展应用程序是一个高级主题。我只显示将替换If-Else示例的确切部分。如果您想查看所有涉及的对象,请查看此要点。让我们快速浏览一下代码。方法签名保持不变,因为调用者不需要知道我们的重构。首先,获取程序集中实现公共接口IOrderOutputStrategy的所有类型。然后,我们构建一个字典,将格式化程序的显示名称作为键,将类型作为值。然后从字典中选择格式化程序类型并尝试实例化策略对象。最后,调用策略对象的ConvertOrderToString。作者:NicklasMillard在丹麦四大咨询公司之一担任高级技术顾问,主要担任客户项目的首席开发人员和解决方案架构师。编辑:陶佳龙来源:https://medium.com/swlh/5-ways-to-replace-if-else-statements-857c0ff19357

猜你喜欢