はじめに
この投稿では、スキルの音声設計についてではなく、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ドキュメント
プロジェクトルートディレクトリ構成
※ ここのモデルは前述のモデルとは関係ありません
├── .ask … Alexa Skills Kit ディレクトリ
│ └── config … スキル構成情報
├── lambda … lambda関数格納 ディレクトリ
│ └── custom … カスタムスキル関数格納 ディレクトリ
├── models … モデル(インテントスキーマ等) ディレクトリ
│ └── ja-JP.json … ローカライズファイル(日本語)
└── skill.json … スキルマニフェストファイル
AWS Lambda ファンクション ディレクトリ構成
※ 前述のディレクトリ構成のlambda部分です。
lambda
└── custom
├── enums … 列挙型
├── handlers … ハンドラ
├── helpers … ヘルパー(ユーティリティとか)
├── intents … インテント
├── models … モデル
├── tests … 単体テスト
└── utterances … 発話
まとめ
この投稿では、アーキテクチャパターンを考え(MVCの解釈をちょっといじった程度ですが。。。)、ディレクトリ構成を決めました。
ざっくりでもいいので、処理毎に役割を分けることによって、プログラム全体が見通しよくなればレビューがしやすいなぁと思った結果の設計になっています。
次回は、環境構築について書きます!