ホームページ >ウェブフロントエンド >jsチュートリアル >TypeScript のデシジョンテーブル: よりクリーンなコードのための過小評価されているパターン

TypeScript のデシジョンテーブル: よりクリーンなコードのための過小評価されているパターン

PHPz
PHPzオリジナル
2024-09-06 21:00:43713ブラウズ

Decision Tables in TypeScript: An Underrated Pattern for Cleaner Code

複雑なソフトウェア システムを構築する場合、開発者は意思決定ロジックを処理するために長い if-else ステートメントや switch ステートメントを使用することがよくあります。

これらのアプローチは機能する可能性がありますが、条件の数が増えるとすぐに管理できなくなります。ここでデシジョンテーブルが役に立ちます。

クリーンで保守可能な方法で複雑な意思決定を簡素化する、強力だがあまり活用されていないパターン。

この記事では、デシジョン テーブルとは何か、デシジョン テーブルを使用する理由、複雑なロジックを簡単に処理するために TypeScript でデシジョン テーブルを実装する方法について説明します。

デシジョンテーブルとは何ですか?

デシジョンテーブルは、入力条件のさまざまな組み合わせを対応するアクションまたは結果にマッピングするための構造化された方法です。これは、各行が入力変数の一意の組み合わせを表し、対応する列が出力またはアクションを定義するテーブルであると考えてください。これにより、考えられるすべてのシナリオを 1 か所で視覚化できるため、管理と理解が容易になります。

たとえば、e コマース プラットフォームを構築しており、顧客ステータス、購入履歴、利用可能なプロモーション、優先言語に基づいて、ユーザーにさまざまな電子メール テンプレートを送信する必要があるとします。

3 つのブール変数 (isGoldCustomer、isFirstPurchase、isPromoAvailable) と 1 つの列挙型変数 (emailLanguage) を使用すると、処理できる組み合わせは 24 通りあります。

ただし、24 個の if-else または switch ケースを記述する代わりに、デシジョン テーブルを使用すると、よりクリーンなソリューションが提供されます。

デシジョンテーブルを使用する理由

デシジョンテーブルには、従来の条件付きロジックに比べていくつかの利点があります。

  • 可読性の向上: 単一の表に考えられるすべての組み合わせが記載されているため、一目で理解しやすくなります。
  • メンテナンスの容易化: ロジックの変更は、ネストされた条件の行をくまなく調べるのではなく、テーブル内の 1 行を更新するだけで簡単になります。
  • スケーラビリティ: デシジョンテーブルは、管理不能になることなく、より複雑な意思決定シナリオを処理できます。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。