Node.js
TypeScript
Alexa
AlexaSkillsKit

TypeScript を使って Alexa Custom Skills を作ろう (1) 設計

はじめに

この投稿では、スキルの音声設計についてではなく、TypeScriptでどう作っていこうかというところを考えていきます。
今後の投稿の実装編ではJavaScriptで作成したサンプルを元にTypeScriptにどう変換していくかを書いていきます。

アーキテクチャパターンについて考える

せっかく TypeScript を使うのに、ただTypeScriptで書くだけではつまらないので、
WEBアプリケーションフレームワークのMVCのようなアーキテクチャパターンをカスタムスキル作成でも考えてみます。

MVCをざっくり解説

MVCでは、プログラム構造を大きく以下の3つに分割しています(ざっくり)。

名前 概要
Model(M) ビジネスロジックを書く
View(V) ユーザに見える部分を書く
ユーザからの要求を取得する部分を書く
Controller(C) ユーザからの要求を受け付けて、インテントを経由して必要であればモデルに渡して結果(ビュー)を返す

Alexa Custom Skillsの場合を考える

MVCと似た感じで、Alexa Custom Skillsについては、以下の3つに分類していきます。

名前 概要
Model(M) ビジネスロジックを書く
Utterance(U) ユーザとAlexaの対話内容(発話)部分を書く
Handler(H) 対話の状態によって、ユーザからの要求(発話)を受け付けて、必要であればモデルに渡して結果(発話)を返す

以上の感じで、ざっくりディレクトリ構成を決めていきます。

ディレクトリ構成を決める

前提

将来的にASK CLIを使うことを考慮したディレクトリ構成です。
ASK CLIとスキルマネジメントAPIドキュメント

プロジェクトルートディレクトリ構成

※ ここのモデルは前述のモデルとは関係ありません

ProjectRootDirectory
├── .ask                                        … Alexa Skills Kit ディレクトリ
│   └── config                                  … スキル構成情報
├── lambda                                      … lambda関数格納 ディレクトリ
│   └── custom                                  … カスタムスキル関数格納 ディレクトリ
├── models                                      … モデル(インテントスキーマ等) ディレクトリ
│   └── ja-JP.json                              … ローカライズファイル(日本語)
└── skill.json                                  … スキルマニフェストファイル

AWS Lambda ファンクション ディレクトリ構成

※ 前述のディレクトリ構成のlambda部分です。

/lambda/custom
lambda
└── custom
    ├── enums                                   … 列挙型
    ├── handlers                                … ハンドラ
    ├── helpers                                 … ヘルパー(ユーティリティとか)
    ├── intents                                 … インテント
    ├── models                                  … モデル
    ├── tests                                   … 単体テスト
    └── utterances                              … 発話

まとめ

この投稿では、アーキテクチャパターンを考え(MVCの解釈をちょっといじった程度ですが。。。)、ディレクトリ構成を決めました。
ざっくりでもいいので、処理毎に役割を分けることによって、プログラム全体が見通しよくなればレビューがしやすいなぁと思った結果の設計になっています。

次回は、環境構築について書きます!