コマンドとサブスクリプション

Earlier in this book we saw The Elm Architecture handle mouse and keyboard interactions, but what about talking to servers? Generating random numbers?

To answer these questions, it helps to learn more about how The Elm Architecture works behind the scenes. This will explain why things work a bit differently than in languages like JavaScript, Python, etc.

sandbox

今まで多くは触れませんでしたが、これまでのプログラムは全て Browser.sandbox から生成されていました。初期値としてのModelを与え、どのようにそれをupdateしてviewするのかを説明してきました。 Browser.sandboxの場合、システムを次のように構成すると考えることが出来ます:

Elmの世界に留まるようになると、関数を書いたり、データを変換する事により、Elmの ランタイムシステム と繋がります。このランタイムシステムがHtmlをどのように効率的に描画するのかを解決してくれます。なんらかの変化があった際に必要とされる最小限のDOMの変更はなにか?また、誰かがボタンをクリックした時や、テキストフィールドになにかをタイプした際にも、同様に解決しMsgに変換した上であなたのElmコードに送り出します。

全てのDOM操作を明確に分離することにより、極めて積極的な最適化が実現可能となります。それがElmのランタイムシステムが利用可能なフレームワークの中で最速の選択肢の一つとなる大きな理由です。

element

続くいくつかの例ではBrowser.elementを使ってプログラムを作ります。ここでは コマンドサブスクリプション の概念を導入することにより、外の世界とのやり取りを可能とします。 Browser.elementではシステムを下記のように構成すると考えることが出来ます。

In addition to producing Html values, our programs will also send Cmd and Sub values to the runtime system. In this world, our programms can command the runtime system to make an HTTP request or to generate a random number. They can also subscribe to the current time.

以前と同じように素晴らしいElmの世界の中でプログラムできますが、これらのCmdSubの値により、ランタイムシステムに対して乱数を生成したり、現在の時刻を尋ねたり、HTTPリクエストを送信するよう指示することができるようになります。 いくつかの例を見ていくと、コマンドとサブスクリプションについての理解が深まると思いますので、やってみましょう!

Note 1: アセットのサイズについて心配する方がいるかもしれません。“ランタイムシステムって大きいもんでしょ!” いいえ、そんな事はありません。実際には、Elmの競合となるいくつかのものと比べても、Elmのアセットは非常に小さいのです

Note 2: 続く例ではパッケージをpackage.elm-lang.orgから利用していきます。すでにいくつかの物を利用済みです:

その他にも非常に沢山のパッケージがpackage.elm-lang.orgに存在します。ローカル環境で自分のElmプログラムを作る際には、次のようなコマンドをターミナル上で実行することになるでしょう:

elm init
elm install elm/http
elm install elm/random

これにより、elm.json内にelm/httpelm/randomを依存関係としてセットします。

続く例の中でも使用するパッケージに付いて触れますので、これらがどんな役割を果たすか判明するでしょう!

results matching ""

    No results matching ""