TypeScript 中的决策表:一种被低估的简洁代码模式

typescript 中的决策表:一种被低估的简洁代码模式

在构建复杂的软件系统时,开发人员经常诉诸冗长的 if-else 或 switch 语句来处理决策逻辑。

虽然这些方法可行,但随着情况数量的增加,它们很快就会变得难以管理。这就是决策表发挥作用的地方。

一种强大但未充分利用的模式,以干净、可维护的方式简化复杂的决策。

在本文中,我们将探讨什么是决策表、为什么应该使用它们,以及如何在 typescript 中实现它们以轻松处理复杂的逻辑。

什么是决策表?

决策表是一种将输入条件的各种组合映射到相应的操作或结果的结构化方法。将其视为一个表,其中每行代表输入变量的唯一组合,相应的列定义输出或操作。这使您可以在一个地方可视化所有可能的场景,从而更易于管理和理解。

例如,假设您正在构建一个电子商务平台,需要根据用户的客户状态、购买历史记录、可用促销和首选语言向用户发送不同的电子邮件模板。

使用 3 个布尔变量(isgoldcustomer、isfirstpurchase、ispromoavailable)和一个枚举变量(emaillanguage),可以处理 24 种可能的组合。

但是决策表提供了一个更清晰的解决方案,而不是编写 24 个 if-else 或 switch case。

为什么使用决策表?

与传统条件逻辑相比,决策表具有多种优势:

提高可读性:单个表格捕获所有可能的组合,使其更容易一目了然。更容易维护:修改逻辑变得像更新表中的单行一样简单,而不是梳理嵌套条件行。可扩展性:决策表可以处理更复杂的决策场景,而不会变得难以管理。

让我们深入了解如何在 typescript 中实现决策表。

如何在 typescript 中实现决策表

在 typescript 中实现决策表的最简单方法是使用对象数组。每个对象代表决策表中的一行。
然后就可以使用数组的find方法来查找与输入变量匹配的行并返回相应的输出值。

type TEmailLanguage = 'en' | 'es' | 'fr';interface IDecisionTableRow {  //These are the input values that determine the output value  isGoldCustomer: boolean;  isFirstPurchase: boolean;  isPromoAvailable: boolean;  emailLanguage: TEmailLanguage;  // The last property is the output value  template: string;};const DECISION_TABLE: IDecisionTableRow[] = [  {    isGoldCustomer: true,    isFirstPurchase: true,    isPromoAvailable: true,    emailLanguage: 'en',    template: 'welcome_en.html',  },  {    isGoldCustomer: true,    isFirstPurchase: true,    isPromoAvailable: true,    emailLanguage: 'es',    template: 'welcome_es.html',  },  {    isGoldCustomer: true,    isFirstPurchase: true,    isPromoAvailable: true,    emailLanguage: 'fr',    template: 'welcome_fr.html',  },  // more rows...];const getTemplate = (  isGoldCustomer: boolean,  isFirstPurchase: boolean,  isPromoAvailable: boolean,  emailLanguage: EmailLanguage): string => {  const row = decisionTable.find(    (row) =>      row.emailLanguage === emailLanguage &&      row.isGoldCustomer === isGoldCustomer &&      row.isFirstPurchase === isFirstPurchase &&      row.isPromoAvailable === isPromoAvailable   );  if (!row) {    throw new Error('No matching row in decision table');  }  return row.template;};

登录后复制

在此示例中,我们有一个名为 decision_table 的对象数组,它表示决策表。
每个对象都有 4 个表示输入变量的属性和 1 个表示输出值的属性。

gettemplate 函数将输入变量作为参数,并使用 find 方法在决策表中查找与输入变量匹配的行。

如果没有找到行,函数会抛出错误。

就是这样!您现在拥有一种干净、可维护的方式来处理依赖于多个输入变量的复杂逻辑。

其他注意事项

规则优先级:如果多个规则匹配输入条件,您可能需要定义优先级机制来确定正确的输出。默认值:考虑提供默认输出,以防找不到匹配规则。数据验证:实施验证以确保输入值有效且在预期范围内。

结论

决策表提供了一种强大而有效的方法来管理 typescript 中的复杂决策逻辑。通过提供清晰且结构化的规则表示,它们增强了代码的可读性、可维护性和可扩展性。通过在项目中采用决策表,您可以提高代码库的整体质量和效率。

因此,下次您发现自己编写了一堆 if-else 语句或 switch 语句来处理复杂逻辑时,请考虑使用决策表。

编码愉快!

以上就是TypeScript 中的决策表:一种被低估的简洁代码模式的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2669559.html

(0)
上一篇 2025年3月7日 12:46:30
下一篇 2025年2月19日 12:06:28

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用 DEVto API 在 Nextjs 中获取博客文章

    如果您想在 next.js 网站上展示您的 dev.to 博客文章,那么您很幸运! dev.to 提供了一个易于使用的 api,可让您以编程方式获取博客文章。在本指南中,我将向您展示如何将 dev.to 的 api 集成到您的 next.j…

    2025年3月7日
    000
  • 一键隐藏所有固定的浏览器扩展

    大家好,我是一名开发者,也是一名内容创作者。我经常需要录制教学视频。录制之前,需要做很多隐私保护准备,比如隐藏书签栏、隐藏顶部工具栏、隐藏我正在使用的浏览器扩展 浏览器不提供一键隐藏所有固定浏览器扩展的功能,所以我开发了一个插件。 该插件适…

    2025年3月7日
    200
  • 在 C# 和 JavaScript 之间选择进行网页抓取

    简单了解C#和JavaScript网页抓取的区别 C#作为编译型语言,提供了丰富的库和框架,如HtmlAgilityPack、HttpClient等,方便实现复杂的网页爬取逻辑,并且代码简洁高效,具有较强的调试和错误处理能力能力。同时C#具…

    2025年3月7日
    200
  • 如何解决 Nextjs 中的水合错误

    “水合失败,因为服务器渲染的 html 与客户端不匹配……” 如果您一直使用 next.js 来构建应用程序,您一定遇到过上述错误或类似的错误。 这称为水合错误。 当我第一次开始使用 next.js 时,我曾经遇到过…

    2025年3月7日
    200
  • 免费接龙

    很久以前,在同一个星系中,我开始尝试制作 freecell,作为学习 angular 1.3 的一种方式。 我已经走了这么远,然后我就被其他事情分散了注意力,就像副项目一样。 我最近有一些空闲时间(我知道,我也没想到),所以我想我应该再试一…

    2025年3月7日
    200
  • 每个开发人员都应该掌握的 JavaScript 数组方法(第 1 部分)

    “能力越大,责任越大。”— 本叔叔,蜘蛛侠 (2002) 就像蜘蛛侠必须掌握他新发现的能力一样,开发人员需要掌握 javascript 强大的数组方法才能高效、负责任地进行编码。 让我们深入研究一些必须知道的数组方法! 1. 查找 find…

    2025年3月7日
    200
  • 代码日

    我仍在处理抓取任务。在这些任务中,我学到了一些针对特定情况的技巧,我没有把它们记录下来以供将来参考。 我学到了什么 当目标元素具有像 href=”Javascript:~” 这样的属性时,最好使用 .click() …

    2025年3月7日
    200
  • 类组件中的 React Hook

    介绍 在某些情况下,我们假设您必须在基于 react 类的组件中使用 react hook 概念。 但是正如你所知,如果你想在基于类的组件中直接使用它们,反应钩子只能在功能组件中工作。 它将出现错误。 那么如何做呢,有一个解决方案。 有3步…

    2025年3月7日
    200
  • 电子书

    es6 (ecmascript 2015) 为 javascript 引入了多项新功能和语法改进。以下是最重要的 es6 语法的总结和示例: 1. let 和 const 关键字 es6 为块作用域变量引入了 let 和 const。 le…

    2025年3月7日
    200
  • 使用 React 构建笑话生成器

    介绍 在本教程中,我们将指导您使用 react 构建一个简单而有趣的笑话生成器。这个项目非常适合想要练习在 react 中处理 api 请求并管理功能组件中的状态的初学者。 项目概况 这个笑话生成器从 api 中获取随机笑话,并在用户单击按…

    2025年3月7日
    200

发表回复

登录后才能评论