アプリの外側とのやりとりを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に似てる (図は同記事より引用)。