Declarative APIとは

iOSDC2020で初めて知ったキーワード「Declarative API」。日本語では「宣言的」と言われるが、イマイチピンと来ない。ネット上を調べると「あるべき状態を指定する」とあるが、これもよくわからない。Declarative APIの対義語にあたるのがImperative APIらしく、こちらは命令的とか書かれている。Declarative APIは「フワッとゴールを示す」のに対して、Imperative APIは「ゴールに向けて細かな手順を示す」くらいの感じっぽい。

他のサイトも見てると、クルマの例があった。これはイメージしやすかった。

Imperativeは、マニュアルミッションのクルマ。前に進みたければ、アクセルとクラッチとシフトレバーで、ギア比を適切に変えて加速していかないといけない。一つ一つの手順を自分でコントロールするので、まさに命令的。

逆にDeclarativeは、オートマのクルマ。前に進みたければ「D」を選択してアクセルを踏むだけ。もちろん加速していくのにはギアの切り替えが必要なのだが、そこはユーザから隠蔽されている。これがDeclarative。

ここまでくると、逆にDeclarative APIに良い印象を受けない。昔、C言語でプログラムを書いていて、Javaに切り替えた際に、いろんなライブラリが揃っていて便利だと思ったのだが、この時の感覚に似ている。

C言語ではHTTPアクセスするにも、ソケットを開いたり、リクエストを作ったり、送信したり、受信バッファを管理したり、全て自分で制御する必要があった。まさにImperativeかなと。逆にJavaだと、HTTPリクエストを投げるようなメソッドをコールしたら、レスポンスが返ってくるので、ここでいうDeclarativeが当てはまると思う。

で、Declarativeが便利なのかというと、細かい調整ができなくて、悪戦苦闘した思い出しかない。確かにある程度割り切った実装であれば、簡単に実装できて便利なのだが。

あまり良い印象はないが、SwiftUIで使えば相性が良かったりするのかなと淡い期待を抱きつつ。GUI制御に細かい手順をユーザに求めると呼び出し順序や呼び出し方のパターンが多岐にわたるので、Declarativeにしてシンプルにしたいのかなとも思う。単純にDeclarativeの理解が間違ってるかもしれないが、もう少し勉強を進めたいと思う。

ちなみに、Declarativeな実装が可能になるのは、それをImperativeに実装してくれているからであって、やっぱり誰かがImperativeな実装をする必要があって、その実装次第でDeclarativeの使い勝手は格段に変わるんだろうな。

この記事が気に入ったらサポートをしてみませんか?