Edited at

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

More than 1 year has passed since last update.


はじめに

この投稿では、スキルの音声設計についてではなく、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の解釈をちょっといじった程度ですが。。。)、ディレクトリ構成を決めました。

ざっくりでもいいので、処理毎に役割を分けることによって、プログラム全体が見通しよくなればレビューがしやすいなぁと思った結果の設計になっています。

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