当前位置:首页 > 公众号精选 > 架构师社区
[导读]来源:翻译自:NicklasMillard的文章《BetterSoftwareWithoutIf-Else》注:本文并不肯定或者否定哪一种写法,仅仅为大家提供一些其他的编码思路或者一些值得借鉴的点子,希望大家能在公众号的每一篇文章中都能有所收获,同时欢迎探讨!设计更好的软件,替换If-Else的5种方法。入门到高级示例让我直接说这句话:If-Else通常是一个糟糕的选择。它导致设计复杂,代码可读性差,并且可能导致重构困难。但是,If-Else已成为事实上的代码分支解决方案,这确实是有道理的。这是向所有有抱负的开发人员讲授的第一件事。不幸的是,许多开发人员从来没有前进到更合适的分支策略。有些人的...


来源:翻译自: Nicklas Millard 的文章《Better Software Without If-Else

注:本文并不肯定或者否定哪一种写法,仅仅为大家提供一些其他的编码思路或者一些值得借鉴的点子,希望大家能在公众号的每一篇文章中都能有所收获,同时欢迎探讨!


设计更好的软件,替换 If-Else 的 5 种方法。入门到高级示例


让我直接说这句话:If-Else 通常是一个糟糕的选择。


它导致设计复杂,代码可读性差,并且可能导致重构困难。


但是,If-Else 已成为事实上的代码分支解决方案,这确实是有道理的。这是向所有有抱负的开发人员讲授的第一件事。不幸的是,许多开发人员从来没有前进到更合适的分支策略。


有些人的口头禅是:If-Else 是一把锤子,一切都是钉子。


无法区分何时使用更合适的方法是区分大三学生和大三学生的原因之一。


我将向您展示一些技巧和模式,这些技巧和模式将终结这种可怕的做法。

每个示例的难度都会增加。


完全不必要的 else 块

面试官 | 写if 时不带 else,你的代码会更好!

Simple if-else

只需删除 else` 块即可简化此过程。

面试官 | 写if 时不带 else,你的代码会更好!Removed else

看起来更专业吧?

您会经常发现,实际上根本不需要其他块。像在这种情况下一样,您想要在满足特定条件的情况下执行某些操作并立即返回。


价值分配

如果您要根据提供的某些输入为变量分配新值,请停止 If-Else 废话 - 一种更具可读性的方法。

面试官 | 写if 时不带 else,你的代码会更好!

Value assignment with if-else


尽管很简单,但它却很糟糕。首先,If-Else 很容易在这里被开关取代。但是,我们可以通过完全删除 else 来进一步简化此代码。


面试官 | 写if 时不带 else,你的代码会更好!


前提条件

如果您要根据提供的某些输入为变量分配新值,请停止 If-Else 废话 - 一种更具可读性的方法


通常,我发现,如果方法提供了无效的值,则继续执行是没有意义的。假设我们从以前就有了 DefineGender 方法,要求提供的输入值必须始终为 0 或 1。


面试官 | 写if 时不带 else,你的代码会更好!

Method without value checks

在没有价值验证的情况下执行该方法没有任何意义。因此,在允许方法继续执行之前,我们需要检查一些先决条件。


应用保护子句防御性编码技术,您将检查方法的输入值,然后继续执行方法。

面试官 | 写if 时不带 else,你的代码会更好!Check preconditions with guard clauses

至此,我们确保仅在值落在预期范围内时才执行主逻辑。


现在,IF 也已被三元代替,因为不再需要在结尾处默认返回 "未知"。


将 If-Else 转换为字典—完全避免 If-Else

假设您需要执行一些操作,这些操作将根据某些条件进行选择,我们知道以后必须添加更多操作。



面试官 | 写if 时不带 else,你的代码会更好!

也许有人倾向于使用久经考验的 If-Else。如果添加新操作,则只需简单地添加其他内容即可。很简单 但是,就维护而言,这种方法不是一个好的设计。


知道我们以后需要添加新的操作后,我们可以将 If-Else 重构为字典。

面试官 | 写if 时不带 else,你的代码会更好!可读性已大大提高,并且可以更轻松地推断出该代码。
“注意,仅出于说明目的将字典放置在方法内部。您可能希望从其他地方提供它。”



扩展应用程序—完全避免使用 If-Else

这是一个稍微高级的示例。


通过用对象替换它们,知道何时甚至完全消除 If。


通常,您会发现自己不得不扩展应用程序的某些部分。作为初级开发人员,您可能会倾向于通过添加额外的 If-Else(即 else-if)语句来做到这一点。


举这个说明性的例子。在这里,我们需要将 Order 实例显示为字符串。首先,我们只有两种字符串表示形式:JSON 和纯文本。在此阶段使用 If-Else 并不是什么大问题,如果我们可以轻松替换其他,只要如前所述即可。

面试官 | 写if 时不带 else,你的代码会更好!知道我们需要扩展应用程序的这一部分,这种方法绝对是不可接受的。

上面的代码不仅违反了 "打开 / 关闭" 原则,而且阅读得不好,还会引起可维护性方面的麻烦。


正确的方法是遵循 SOLID 原则的方法 - 我们通过实施动态类型发现过程(在本例中为策略模式)来做到这一点。


重构这个混乱的过程的过程如下:

  • 使用公共接口将每个分支提取到单独的策略类中
  • 动态查找实现通用接口的所有类
  • 根据输入决定执行哪种策略
  • 替换上面示例的代码如下所示。是的,这是更多代码的方式。它要求您了解类型发现的工作原理。但是动态扩展应用程序是一个高级主题。

我只显示将替换 If-Else 示例的确切部分。如果要查看所有涉及的对象,请查看此要点。面试官 | 写if 时不带 else,你的代码会更好!

让我们快速浏览一下代码
方法签名保持不变,因为调用者不需要了解我们的重构。
首先,获取实现通用接口 IOrderOutputStrategy 的程序集中的所有类型。然后,我们建立一个字典,格式化程序的 displayName 的名称为 key,类型为 value。
然后从字典中选择格式化程序类型,然后尝试实例化策略对象。最后,调用策略对象的 ConvertOrderToString。
作者介绍:
Nicklas Millard 在丹麦的四大咨询公司之一中担任高级技术顾问。他主要担任客户项目的首席开发人员和解决方案架构师。
他一直在为商业客户和政府机构开发软件,例如国防部,教育部,丹麦环境与食品部,国家警察,丹麦劳动力市场和招聘局以及 rstad。select_card mp_profile_iframe" data-pluginname="mpprofile" data-id="MzU0OTE4MzYzMw==" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/fEsWkVrSk55KKLFaGCDRURMvFtPXf9fZXJOHOFsA3Ye8Qbibf3qHLkBQNpdjicAVpPf2T03EcakjAFbwqicjXSibXA/0?wx_fmt=png" data-nickname="架构师社区" data-alias="devabc" data-signature="架构师社区,专注分享架构师技术干货,架构师行业秘闻,汇集各类奇妙好玩的架构师话题和流行的架构师动向!" data-from="0">

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭