首頁  >  文章  >  web前端  >  TypeScript 中的決策表:一種被低估的簡潔程式碼模式

TypeScript 中的決策表:一種被低估的簡潔程式碼模式

PHPz
PHPz原創
2024-09-06 21:00:43624瀏覽

Decision Tables in TypeScript: An Underrated Pattern for Cleaner Code

在建立複雜的軟體系統時,開發人員經常訴諸冗長的 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 中的決策表:一種被低估的簡潔程式碼模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn