---
title: "プログラム可能な意思決定の管理"
slug: "managing-programmable-decisions"
abstract: "Sitecore Personalizeにおけるプログラム可能な意思決定の最適な管理方法の概要。"
---
# プログラム可能な意思決定の管理

プログラム可能な意思決定は、組織が意思決定モデルのバリアントでJavaScriptを活用できるようにし、以下のような利点を提供します。

-   決定時にサーバーサイドJavaScriptを実行する
-   意思決定にリアルタイムの文脈データを含みます
-   意思決定に活用するために、組織のカスタム属性を活用しましょう

プログラム可能な意思決定は、JavaScriptを書くことに慣れた技術ユーザー向けに設計されています。もしそうなら、**意思決定テンプレート**を作成することを検討してください。これは再利用可能なコード不要の意思決定コンポーネントで、意思決定パレットに公開して他の人がキャンバスにドラッグ&ドロップできるようにするものです。

## 意思決定テンプレート

意思決定テンプレートを作成する際:

-   この決定は複数の意思決定モデルで再利用されます。
-   技術に詳しくないユーザーにも、JavaScriptを書いたり見たりせずに決定を調整できるような、設定可能なフォームを提供したいのです。

## プログラム可能な意思決定におけるJavaScriptの活用

JavaScriptを書く際には、以下のことができます:

-   プログラム可能な意思決定、知識ソース、意思決定テーブルなど、他のコンポーネントから変数にアクセスできます。
-   接続を通じて提供されるデータシステムや分析モデルの変数を活用しましょう。

各プログラム可能な決定には出力 **参照**を割り当てることができ、その出力を表す一意の名前を付けることができます。この出力参照は、意思決定テーブル、追加のプログラム可能な意思決定、分析モデルなど、他の意思決定コンポーネントの入力として利用できます。

## プログラム可能な決定の再利用

プログラム可能な意思決定は、以下によって意思決定モデル間で共有できます:

-   それらを別の意思決定モデルのバリアントにダウンロードしてアップロードします。
-   新しいプログラム可能な決定を別のバリアントで作成する際にコピー&ペーストするだけです。

## 配列の扱いについて

現在、プログラム可能な意思決定は配列内のネスト属性にアクセスする唯一の方法です。これらは必要な属性を取得し、それを意思決定プロセスの入力として他の意思決定(例えば意思決定テーブル)に利用されます。

## プログラム可能な意思決定の構造化

モデルにプログラム可能な決定を追加する前に、推奨されるコード構造に従ってください。以下のように即時呼び出し関数式(IIFE)を使用します。

(function () {
 statements
})();

IIFEは定義されるとすぐに実行されます。このパターンが役立ちます:

-   IIFE式内の変数へのアクセスを阻止します。
-   グローバルにアクセス可能な変数を多数に作りすぎないようにしましょう。

IIFEは本質的に独自の語彙範囲を持つ自己実行型匿名関数です。詳細は[IIFE](https://en.wikipedia.org/wiki/Immediately_invoked_function_expression)を参照してください。

## MAPオブジェクトの返送

**MAPオブジェクト**は、プログラム可能な決定から複数の関連する値を返すことができるキー・バリューのデータ構造であり、単一の値に限定されるのではなく、

MAPオブジェクトを使って以下を利用できます:

-   関連する複数の情報を一度に返送してください。
-   異なるシステムが必要なデータ部分だけを使えるようにしましょう。
-   配列と比べて位置の意味を覚える必要がないので、分かりやすさを向上させます。

### プログラム可能な判定の例

以下のプログラム可能ツールは、国籍と性別の入力データに基づいて顧客の階層および割引率を計算します。

// Example: determine customer tier and discount
(function () {
 var returnValue = {};
 // assume \`guest\` is already provided by the runtime, do not redeclare it

 // --- Tier calculation based on nationality ---
 if (typeof guest.nationality === 'string') {
 if (guest.nationality === 'Denmark') {
 returnValue.tier = 'Gold';
 } else {
 returnValue.tier = 'Standard';
 }
 }

 // --- Discount calculation based on gender ---
 if (typeof guest.gender === 'string') {
 if (guest.gender === 'female') {
 returnValue.discount = 0.10;
 } else if (guest.gender === 'male') {
 returnValue.discount = 0.08;
 } else {
 returnValue.discount = 0.05;
 }
 } else {
 returnValue.discount = 0.05;
 }

 return returnValue; // MAP object
})();

Personalizeで設定する際は、プログラム **可能な名前** (例: *Progammable 1*)、**出力参照** (例: *programmable1*)、**型** を*Map*に設定してください。

![Programmable settings should indicate the name, output reference, and type Map.](https://doc.sitecore.com/api/markdown-image/personalize/ja/users/sitecore-personalize/images/programmable_MAP.png)

> !警告 **タイプ** が更新されない場合、出力は文字列として解釈されます。

### 回答例

genderの値が*Male*でnationality*が未知*のサンプルゲスト入力の場合、プログラム可能入力は複数のキー値ペアを持つMAPを返します。

"outputs": 
 {
 "programmable1": {
 "tier": "Standard",
 "discount": "0.08"
 }
 }
 

### 意思決定モデルにおけるMAP出力の利用

プログラム可能な決定の出力を使って決定テーブルを作成できます。

意思決定表でMAP出力を使用するには:

1.  入力列を追加し、プログラム可能な決定を入力として選択します。この例では、プログラム可能な名前の*Programmable 1*を使用しています。
    
    ![Input column settings should indicate the name, MAP key and data type.](https://doc.sitecore.com/api/markdown-image/personalize/ja/users/sitecore-personalize/images/Add_Input_column_prog.png)
    
2.  入力列については以下を指定します。
    
    -   **列名** - 入力に使用する名前(例: *Guest*)
    -   **Map Key** - 決定テーブルで入力として評価したいプログラム可能な出力の属性です。(例: programmable1.tier)。
    -   **タイプを選択し** てください - 指定された属性に基づいて正しいデータタイプを選択します。
3.  **入力**列が追加されたら、通常通り決定テーブルの設定を続けます。
    

### ベストプラクティス

-   **MAPは平坦で予測可能に保** ち、深く入れ子されたオブジェクトは避けましょう。
-   **すべてのキーをドキュメント化し** 、プログラム可能な決定が返すMAPキーを明確に指定してください。
-   **入力を検証する** - 受信paramsをチェックして予期せぬ動作を防ぎましょう。
-   **不確実性を安全に扱いましょう。信頼度が低い、データが欠落している場合は、**null
-   **必要なパラメータを確認する** - パラメータが渡されなければ、プログラム可能なものはデフォルトに戻されます。呼び出し先のシステムが必要なパラメータを提供していることを必ず確認してください。