5.4 KiB
1.2. 既存の抽象化と、その範囲
HTTP API
HTTPを使えば、異なる言語や環境で実装されたClientとサーバーが、共通のrequest / response形式で通信できる。Method、URI、status、header、representationには共通の意味があり、アプリケーションごとに通信の基本から設計し直す必要はない。
ただし、HTTPを採用しただけでは、アプリケーションの操作モデルまでは揃わない。どのURIが操作対象を表すのか、どの操作を公開するのか、引数と結果をどう表現するのかは、個々のAPIの設計に依存する。呼び出し方を知るために、個別のAPI仕様を参照する場面は残る。
OpenAPIなどで操作やSchemaを機械可読に記述することもできる。それでも、APIを記述できることと、実行時に存在する対象を共通の方法で辿り、その対象が公開する操作を取得できることは同じではない。WIPでは、通信形式やAPI定義に加え、対象の発見から操作までを共通のモデルとして扱いたい。
HTTPが不足しているというのは、その用途に対して通信機能が足りないという意味ではない。HTTPの契約だけでは決まらない、アプリケーション操作の契約が必要だということである。WIPも、通信にはHTTPを利用できる。
REST
RESTは、通信上の呼び出しを並べるだけの方式ではない。資源の識別、representationを通した操作、自己記述的なメッセージ、hypermediaによる状態遷移などを、統一インタフェースの制約として扱う。リンクや操作の手掛かりを辿って利用を進める考え方も含んでいる。
したがって、WIPの動機を「RESTでは対象を発見できない」「RESTでは意味的操作を表現できない」と説明するのは適切ではない。Issueを閉じることも、資源の状態変更や関連する資源への操作として表現できる。
一方、その表現をClientがどう理解するかには、media typeやドメイン固有の契約が必要になる。RESTの制約を採用することだけで、任意の対象に対するOperation名、引数と結果の型、操作の説明、それらを取得する手順まで、一つの共通モデルに決まるわけではない。
WIPでは、この部分をObjectとInterfaceの契約として明示したい。資源をどうHTTPへ対応付けるかに先立って、何が操作対象で、どの操作を持ち、その宣言をどう取得するかを定める。RESTで同様の仕組みを実装できないのではなく、WIPが求める共通化には、その仕組み自体の定義が必要になる。
システムコール
システムコールは、プロセスからOSの機能を利用するための共通インタフェースを提供する。同じOSの契約に従えば、アプリケーション内部の実装が違っても、ファイル、プロセス、メモリなどを共通の操作で扱える。
この抽象化の対象は、OSが提供する機能である。Issueを閉じる、Pull Requestをmergeする、Agentへ問い合わせるといったアプリケーション固有の操作まで、共通のシステムコールとして公開されるわけではない。システムコールを使って通信やプロセス間連携を実装しても、その先の操作の意味は別途定める必要がある。
WIPで共通化したいのは、OS資源へのアクセスより上の、アプリケーションが公開する対象と操作である。対象の実装が同じプロセス内にあるか、別のserviceにあるかによらず、Clientから同じモデルで扱えることを目指す。
Filesystem
Filesystemは、異なる資源を単一の名前空間へ配置し、少数の操作で探索するためのモデルになる。Pathを辿って対象へ到達できることは、対象ごとの呼出先を最初からすべて知っている方式とは異なる。
しかし、file / directoryとread / writeを中心にしたモデルだけでは、アプリケーション固有の操作を自然に表しにくい。Issueの内容をfileとして読めても、それだけではIssue.close()の引数や意味は分からない。特殊なファイルへの書き込みなどで操作を表現することはできるが、その規約を別途理解する必要がある。
WIPは、名前空間を辿って対象を見つける性質を使いつつ、対象の操作をread / writeに限定しない。Issue.close()、PullRequest.merge()、Agent.ask()のような操作を、対象が公開するInterfaceの中に、それぞれの名前と型を持つOperationとして表す。
WIPが共通化する範囲
HTTP API、REST、システムコール、Filesystemは、それぞれ異なる範囲を抽象化している。WIPはそれらをまとめて置き換えるのではなく、アプリケーションの操作対象、配置、利用可能な操作、引数と結果の型を、ClientとHostの間の共通契約にする。
Hostは、その背後でHTTP APIを呼んでも、Databaseへ問い合わせても、Filesystemへアクセスしてもよい。Clientに対しては、それらの内部構成とは独立に、対象の発見・観測・Operation実行を公開する。