クライアントサイドの実装におけるModelとは何か
#GUI #設計 #Server_State #宣言的UIの設計レシピ
先に結論
MVCはプレゼンテーションのためのアーキテクチャ
関心の分離はドメインとプレゼンテーションから考える(PDS)
データやロジックに関するアーキテクチャではない
本物のMVCの図
先人たち
現代においてMVCのクライアント側における優位性はほとんど無い
→理由はUIの状態とアプリケーションの状態 を分離する方法がないから
一方では、 アプリケーションの状態 を表す users や products のようなデータがあり
もう一方では、 showTab や selectedValue などのように、 UIの状態 を格納しなければならない
Bunの開発者のツイート
@jarredsumner: @SimonDragsbaek @rickhanlonii @dan_abramov Before React, the “best practice” was Model, View, and Controller. You had three big files for every page. Teams argued about “fat model skinny controller”. Due to “separation of concerns”, sharing parts of pages meant you needed to refactor the controller, model, and view.
Reactコアメンテナのツイート
@rickhanlonii: @dan_abramov It’s like original React changed how we thought about separation of concerns from separating technologies to separating components, and now it’s doing the same for separating the stack. It’s just components all the way down.
クライアントサイドのモデルとは何か 前編 ~ クライアントサイド MVC の死
クライアントサイドのモデルとは何か 後編 ~ 単方向データフローと参照透過性
Flutterでそこそこ規模の大きいプロダクションアプリを作ったのでスケールする設計についてまとめる
世の中の90%のアプリは、よほど小規模なものでもない限りはこの「ActiveRecordパターンの再発明」という罠をダイナミックに踏みつけて爆死します。
簡単な原則を守れば複雑なアーキテクチャはいらない。
ただしスケールするクライアントアプリの設計をするのであればCRUDを基準にした "Model" というクラスは作るべきではない。
Modelはモジュールの総体として浮かび上がるものである。
koushisa.iconの類似スクラップ
複雑GUIにおけるDomain Modelの勘所
複雑GUIにおけるRepositoryパターンの勘所
---
クライアントサイドの実装におけるモデルという概念は何なのか?
モデリングの成果物としてのモデルとは異なるっぽい
"なにか"の概念をオブジェクト指向的に閉じ込めたもの?
抽象化とモデリングの違い
Classでオブジェクト指向をGUIでやってるパターンで成功している事例を見たことがない
Knockout.jsとかも辛かった...koushisa.icon
考察
「Model」っていう命名の抽象度が高すぎる
ロジックはとりあえずモデルに置いとけばええやんみたいな感覚で全ての処理が配置されがち
RailsのFatModelなどはいい例
もっと具体的な名前にしたほうがよいのでは
Modelに全てのデータを乗せるとデータ構造が少しでも複雑になると責務が肥大化して破綻する
CRUDだけで完結するような小規模なアプリでは関心事の分離が動作するように見える
TODOアプリならいざ知らず、現実世界のプロダクトでは考えることが山ほどある
データ構造
ステートへの副作用
ビジネスロジック
データアクセスとその同期
自身をsubscribeしているViewへの更新通知
キャッシュや通知
全てのロジックをModelに閉じ込めると
リグレッション管理のコストが高まる
気づいた時には時既に遅しで誰も手を出せなくなる
Viewとオブジェクトの結びつきの理解が難しい
本来ステート/オブジェクトのライフサイクルとかに密結合な処理が分離されていたりする
オブジェクトにViewのための処理が書かれはじめてデータフローが破綻する
MVVM時代は特にこのような問題が発生しがちだった
オブジェクト指向による継承、mixinによる暗黙的な依存追加の横行
収束
MVCはプレゼンテーションのためのアーキテクチャ
データ、ロジックはまた別の思想が必要となる
Smalltalk MVC
関心の分離はドメインとプレゼンテーションから考える(PDS)
Reactはこのような問題を解決するためにコンポーネント指向や、単方向データフロー(unidirectional data flow)を掲げた
コンポーネントを中心に組み立てることを前提としつつ、データ、ロジックは関心や振る舞いの単位で分ける
Higher-Order Component, Rx, Flux, Render Propsを経てからのfunctional componentとReact Hooks
2022~はData-Flow Graph, React Server Componentsが台頭しつつある
Reactの哲学ではデータとロジックを近づける傾向にあり、その最小単位はコンポーネントである
これが高凝集とレンダリングの一貫性を生む
データとロジックは近い位置にまとめる
宣言的UIのデータアーキテクチャはコンポーネントを中心に考える
宣言的UIのモジュラリティや堅牢性はコンポーネント設計で担保する
技術の螺旋から見ると現代的なアーキテクチャは以下のエッセンスを意識するとシステム全体で高凝集な設計を目指せる
単方向データフロー(unidirectional data flow)
CQS
機能単位パッケージング