フロントエンドシステムにおけるデータ永続化のためのクラス・ディレクトリ構成を考える

MVC アーキテクチャ

古くは Struts からあるような、サーバサイドも含めた MVC アーキテクチャのシステムの場合、大抵は DB アクセスを行う DAO クラスが存在し、それ向けの構成が大体決まっている。

もしくは、Rails のような場合は、ActiveRecord というアプローチで、Model に相当するクラスが最初から DB のテーブル定義と対になっていて、Model クラス自身が「DTO / Entity 兼 DAO」な作りになっていたりする。

データ永続化のアプローチにはこんなやり方が一般的だ。

MVC のディレクトリ構成

MVC デザインパターンのプロジェクトのディレクトリ構成は、以下の2種類に大別できるであろう。

1. 種類別

ModelViewController という種類のディレクトリを切り、その下にクラスが連なる作り。大規模なシステムをこのやり方で作ると、ディレクトリの往来が大変になる。

MyProject
┣models
┃┣HogeModel
┃┗FugaModel
┣views
┃┣HogeView
┃┗FugaView
┗controllers
  ┣HogeController
  ┗FugaController

2. 機能別

まず機能ごと (hogefuga) にディレクトリを分け、その中で ModelViewController といった種類を分ける。このやり方だと、特定の機能を切り出したりする時にディレクトリごと移動・削除するだけで対応できて分かりやすい。

MyProject
┣hoge
┃┣models
┃┃┗HogeModel
┃┣views
┃┃┗HogeView
┃┗controllers
┃  ┗HogeController
┗fuga
  ┣models
  ┃┗FugaModel
  ┣views
  ┃┗FugaView
  ┗controllers
    ┗FugaController

最近は後者の機能別の構成が多いかな?

フロントエンドシステムにおけるデータ永続化

さて、本題に近付いてきた。

バックエンドシステムを含まない、フロントエンドオンリーのシステムにおいても、フロントエンドの中でデータ保持が必要な場合は存在する。SessionStorage や LocalStorage の他、SQLite を利用してローカル DB を持つ場合などがあり得る。

こんなシステムにおいて、どのようなクラス分けを行い、どのようなディレクトリ構成でクラスを管理すると、データ永続化が綺麗にできるだろうか、というのが今回の課題。

いくつか調べてみた感じだと、React.js や Angular のようなライブラリ・フレームワークだと、それ単体で構成するクラスの種類別にディレクトリを作る話しか出てこない。

これはつまり、データ永続化が必要なパターンが少なく、JavaScript なので型を意識することも少ないので、コンポーネント内に適当に混ぜ込んでおいてなんとかなる、ということなのだろうか。

TypeScript を使う Angular の場合は型に対するアプローチはどうなるだろう、とか、Cordova で作るハイブリッドアプリの場合は永続化が必要だよな、とか、色々気になるので、もう少し調べてみた。

…ということで、複数のモデルを扱うようなサンプルがイマイチ見当たらず。これといった解が得られなかった。

最近のアプリは API サーバと RESTful にやり取りして、ローカル DB とか要らないんだろうか。いやでもしかし…必要な場合はあるし…そんなロジックを適当に1つの DB クラスに混ぜ込んだりとか…気持ち悪いし…。

誰か良いサンプルがあったら教えてください。