请教如何简化大量 IF

本贴最后更新于 1908 天前,其中的信息可能已经水流花落

在工作过程中遇到大量的 IF 嵌套业务,当时的做法是不停的抽出方法来....
但是抽方法 好烦啊,一个类里面一堆的方法,特别是起名字,太难了... 完犊子
我想了想,搞了这么一个东西,但是感觉可读性还是很差。希望各位大佬指点指点。

//链式只要出现一次false即中断 IFChain.newInstance() .chainIf(1 == 1) .executeTrue(() -> { }) .executeFalse(()->{ }) .chainIf(2 == 2) .executeTrue(() -> { }) .executeFalse(()->{ }) .chainIf(3 == 3) .executeTrue(() -> { }) .executeFalse(()->{ }) .chainIf(4 == 4) .executeTrue(() -> { }) .executeFalse(()->{ }) .chainIf(5 == 5) .executeTrue(() -> { }) .executeFalse(()->{ }) ;

对标写法如下

if (1 == 1) { if (2 == 2) { if (3 == 3) { if (4 == 4) { if (5 == 5) { } } } } }
打赏 20 积分后可见
20 积分 • 6 打赏
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250 1 1 赞同 1 评论

    我偏向于这样解决:

    while (true) { if (1 != 1) { break; } // 做 1 == 1 逻辑 if (2 != 2) { break; } // 做 1 == 1 且 2 == 2 逻辑 break; }

    可以加个 count 计数器,避免意外情况出现死循环。

    嗯 这种确实是可行
    pencilso
  • someone1764 2 评论 via Linux

    跟 swicth case 差不多的感觉

    1 回复
    switch 是平级的,跟这个不一样,这个是嵌套,嵌套和平级是不一样的
    pencilso
    @pencilso 那路或多
    someone1764
  • Eddie

    欲言又止

  • hjljy

    我感觉确实不好优化 if

  • Eddie

    有点像责任链模式?

  • Blackman99

    Javascript

    [ [1 === 1, () => { }], [2 === 2, () => { }] ].reduce((lastCondition, [condition, action]) => { let boolVal = lastCondition && condition if (boolVal ){ action() } return boolVal }, true)
    2 操作
    Blackman99 在 2019-12-24 09:19:55 更新了该回帖
    Blackman99 在 2019-12-24 09:19:17 更新了该回帖
  • jianzh5

    大量的 if 一般使用策略者模式进行优化!

  • Lee981265

    写一个递归函数

  • hjljy

    一些简单的 if 可以用三目运算符。

  • ZephyrJung via macOS

    应该是责任链模式吧

  • Adrift001 via macOS

    不用打赏我都知道, 用工厂. 之前看过. 但是我还是想给你打赏.

  • Adrift001 1 3 评论 via macOS
    和我的需求不符
    pencilso
    需求是嵌套 if
    pencilso
    工厂模式 只适合平级 if 但是不适用嵌套 if
    pencilso
  • 这个打赏太亏了 😭

  • Adrift001 1 评论 via macOS

    嗯,确实有点不符. 🙂

    感谢老铁的打赏
    pencilso
  • Angonger 2 评论

    嵌套 IF 一般考虑的是提前结束来减少嵌套层数

    但是 如果当你的 return 必须要写两行代码呢
    pencilso
    @pencilso 最好给我场景,不是几行代码的问题,我有说提前结束这种是解决什么问题的
    Angonger
  • poc9999

    不满足条件的可以提前 return

  • power721

    状态机?

请输入回帖内容 ...
pencilso
这个人很懒,什么也没有留下。 北京

推荐标签 标签

  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 441 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 19 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖 • 2 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 140 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1741 回帖 • 2 关注
  • OpenCV
    15 引用 • 36 回帖 • 2 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    182 引用 • 1005 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 463 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 617 关注
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 816 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 6 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 720 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    584 引用 • 3537 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 378 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 491 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 168 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 93 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 292 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    126 引用 • 848 回帖