前回は簡単にMilkcocoaでチャットアプリケーションを作りました。今回はそれを拡張する形で、実装していきたいと考えています。また同時にMVCの設計を紹介しながら構築していきます。
SPAによるフロントエンド設計の重要性
MilkcocoaなどによりBaaSのWebアプリケーションを作る際は、フロントエンドやクライアントサイドが肥大化します。基本的にBaaSは汎用的な機能を提供し、ビジネスロジック等はクライアントサイドで実装する形になる場合が多く、またそれにより、サーバでレンダリングしていたものをクライアントサイドのJSでDOMを動的に構築したり、他にもクライアントサイドのキャッシュなども重要になり、コード量が多くなります。
SPA(シングルページアプリケーション)を構築する際、その設計をしておかないと地獄が待っているわけです。jQueryなどを使いよくCSSやJS設計もせずに構築すると、コードが肥大するにつれてプロジェクトがぐちゃぐちゃな状態になり、保守が難しくなる、という状況になります。実際にSPA化により、保守が非常に大変になったプロジェクトをよく聞きます。特に設計スキルは無くとも、マークアップとちょっとしたjQueryが書けるというようなデザイナーが、SPAに挑戦しようとするときによく起ります。
そこで設計が非常に大切になります。SPAはすなわち、WebブラウザのGUIになります。GUIというのは、昔からMVCやMVVMなどのデザインパターンがあります。そのためSPAを設計をするときには、MVCなどの設計を覚えておくと良いというわけです。今回はそのMVCの設計について紹介しながら作って行きます。
MVCとは?
MVCについて説明する前に、MVCと言うものにはいくつか種類があるということを言及しておきます。GUIから来たMVCと、WebのMVCがあります。今回はどちらかと言えばGUIのMVCのことになります。またGUIのMVCも様々なパターンがあり、今回筆者が話すのはその内の一つのことについてです。
MVCとはGUIアプリケーションを、モデル、ビュー、コントローラに切りわけて設計するデザインパターンです。モデルは簡単にはアプリケーションのデータとその振る舞い、ビューが見た目、コントローラはユーザからの操作について、分けて設計していきます。
チャットアプリケーションをMVC設計にする
チャットアプリケーションの拡張
チャットアプリケーションを拡張して行きます。以下の機能を追加します。
まずこれについて前回と同様にレイアウトを構成してnobackendで実装しておき、それをMilkcocoaの通信に置き換えます。
レイアウトを構築する
まず簡単にレイアウトを構築しましょう。
本来であればBEMやSMACSと言ったCSS等の設計も必要なのですが、分量が多くなりすぎるため今回は特に記しません。
layout.htmlの表示は以下のようになるはずです。
モデルを書く
画面のレイアウトができたところで、モデルを書いて行きましょう。
重要な点はModelが変更されたときに、Viewに通知するところです。その仕組みを詳しく読んでみてください。
Modelが書けたらテストコードを作成しましょう。
chatModelTest.htmlをWebブラウザで開くとテストコードが実行されます。これでモデルの振る舞い自体は保証できました。
ビューとコントローラを書く
まずはViewを書きましょう。
View自体の重要な点は、Modelの状態を直接変更するようなコードは書かないことです。
そして、Controllerです。
オフラインのチャットを完成させる
それではオフラインのチャットを完成させましょう。
このindex.htmlをWebブラウザで表示すれば、オフラインの削除機能付きチャットを使うことができます。
Milkcocoaでリアルタイムチャットを完成させる
ここまで来たら実際にMilkcocoaを組み込んで、リアルタイムチャットを完成させましょう。
MVCにどの部分にMilkcocoaの通信を置けば良いのでしょうか? それはモデルです。モデルにMilkcocoaのdataStoreのリアルタイム通信を追加して行きましょう。
ここで、Viewに来た通知処理がいったん、dataStoreにデータをpushしたりremoveしたりしていることに気がついたでしょうか? そしてdataStoreのonメソッドにてdataStoreの状態が変更されたことを受け取り、それをnotifyすれば、全てのWebブラウザでリアルタイムに状態を更新しているというわけです。
チャットを完成させる。
最後にチャットを完成させましょう。index.htmlを以下のように修正してください。
これでチャットアプリケーションは完成しました。
まとめ
第3回は、MVCを実践しながらチャットアプリケーションに機能追加をして行きました。BaaSを利用するアプリケーションはクライアント側でのGUIがリッチになることが多いため、しっかり責務を分割して管理することが大切になります。