ZWAの開発を進める

前回の続きです。

AI塾長KAGURAの基盤になるソフトウェアスタックなので、これを何とか形にしないと先に進めません。
フルスタックのWebフレームワークにするのが目標ですが、データベース処理部分だけは先に仕上げてしまいます。

抽象クラスの設計と実装が連続するので、動くものが見られない時間が長いです。頭の中で動いている姿を想像しながらの作業です。

今日までの成果。


ZWAコアの実装が、ひとまず一周しました。
いまのZWAは「Entityスタック+Context+YAMLモデル」で、データアクセスの骨組みが動いています。

設計図のレイヤーには ModelDef / EntityDef / FieldDef がいて、ここが「どんなエンティティを扱うか」を決めます。実行時にはそれが Model / Entity / ObjectBase に展開され、行データはすべて ObjectBase という共通の入れ物で扱います。NeXTのEOFやAppleのCoreDataを知っている人なら、「あれか?!」となると思います。

データベース側は、Repository 抽象と SQLiteRepository に集約しました。プログラマーは基本的に Repository を直接触らず、DatabaseContext を通して add / list / delete / commit だけを呼べばよい構造になっています。

面白いのは、接続情報までをモデルファイルに追い出した点です。model.yaml

  • エンティティ定義
  • connection.engine(例: sqlite)
  • connection.database(DBファイルのパスや接続情報)

を書いておくと、

  1. load_model_from_yaml() で Model を読み込み
  2. open_database_context(model) で接続先が自動で決まり
  3. ctx.ensure_schema() でテーブルが用意され
  4. ObjectBase を使って CRUD が実行できる

という流れになります。

プログラマーが意識するクラスは「Model / Entity / ObjectBase / DatabaseContext」と、open_database_context() くらいまで。SQLiteかPostgresか、といった具体的な話は裏側に追いやられました。

まだ最小限の機能ですが、「定義ファイルからモデルを起こし、そのモデルに従ってデータベースとやり取りする」というZWAの中心部分は、すでに動き始めています。

次は、リレーションのLazyフェッチとか、複数種類のデータベースへの同時接続とか、トランザクション管理といった機能を入れていく段階です。

コメントする