アプリの外側とのやりとりをModelから取り除く

変更前

これはクライアントサイドのアプリケーションの例で、Modelの背後でWeb APIやonpopstate/pushStateを利用しており、Modelが太くなってる様子。

HTTP History | ^ | ^ | | | | v | v | .---- View \<-- M o d e l \<-- Intent \<--. | | `----------------\> DOM -------------------'

変更後

Web APIもonpopstate/pushStateもアプリケーションの外側にあり、DOMと同レイヤに存在するものであると位置づける。アプリケーションの外界とのやりとりを行う、ビジネスロジックを含まないアダプタを、ドライバーと呼んで抽象化する。ドライバーには入力を受け取る機能と出力を購読させられる機能がある。いまつくってるアプリでは以下の2つのドライバーを用意して使った。

.---- View \<-- Model \<-- Intent \<--. | | |------------\> DOM ----------------| |------------\> History ------------| `-----------\> HTTP ---------------'

参考

The Clean Architecture | 8th Light で言及されているClean Architectureに似てる (図は同記事より引用)。