岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

HTTPの仕様書に「副作用」の定義がないのは不親切じゃね?

Webを支える技術』の101ページに、こう書かれています。

リソースの状態に変化を与えることを副作用(Side Effect)と言います

僕の読み落としでなければ、この定義の出典は同書には明記されていません。ただ、HTTPメソッドの冪等性や安全性を解説する文脈で紹介されているので、HTTP/1.1の仕様書であるRFC 2616が出典なのだろうと思います。

RFC 2616の本文には、「副作用」(side-effects あるいは side effects)という言葉が9回出てきます。最初に出てくるのは「9.1.1 Safe Methods」においてです。橋本英彦さんによる日本語訳を引用します(強調は岩本、以下同じ)。

本質的に、サーバが GET リクエストを実行した結果として副作用を起こさないという事を保証するのは不可能であり、事実、いくつかの動的なリソースはそれが特徴であると考えている。ここで特に区別すべきなのは、ユーザが副作用を要求しなかったという事であり、それゆえにそれらに対しては責任をもてない。

http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec9.1.1

「副作用」という言葉が、明確な定義なしに使われていることが分かります。

直前の段落を見てみます。

特に、GET と HEAD メソッドはその動作にリソースの回収以上の意味を持つべきではないという慣習が確立されている。これらのメソッドは、"安全{safe}" だと考えるべきである。これによって、ユーザエージェントがそれ以外の、例えば POST, PUT, DELETE のようなメソッドを特別な方法で表す事ができるようになり、ユーザにひょっとしたら安全でない動作が要求されているかもしれないという事実を認識させる。

http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec9.1.1

ここにおいて、「GET と HEAD メソッド」の副作用は「リソースの回収以上の」作用であると推測できます。

続く「9.1.2 Idempotent Methods」には、「副作用」という言葉が3つ出てきます。

メソッドは、(エラーや期限切れ発行とは別に) 同一のリクエストの N > 0 の副作用が単一のリクエストにおけるものと同じであるような際には "冪等{idempotence}" の性質を持つ事もできる。 GET, HEAD, PUT, DELETE 各メソッドはこの性質を共有する。また、OPTIONS と TRACE 各メソッドは副作用を持つべきではないし、本来冪等であるものである。

しかしながら、たとえその順序にて実行される全てのメソッドが冪等であったとしても、いくつかのリクエストの順番は冪等ではない。 (もし全体の順序中のある一つを実行しても、その順序の全体、または一部分を再実行した際に結果は常に変わらないという事になるのであれば、順序は冪等である。) 例えば、同じ順序でもその結果が後に修正される値に依存するのであれば、順序は冪等ではない。

副作用を持たない順序は、(同時に起こる動作は同じリソースの一組{set} 上に実行されている事は無い、との条件で) 定義によって冪等である。

http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec9.1.2

ここで僕は混乱します。PUT と DELETE の副作用とは、いったい何なのでしょうか。

冒頭に掲げた『Webを支える技術』によれば、「副作用」=「リソースの状態に変化を与えること」でした。PUT や DELETE の性質を考えれば、ここで使われている3つの「副作用」も、「リソースの状態に変化を与えること」を指しているのだろうと思います。

しかし、PUT や DELETE は「リソースの状態に変化を与えること」こそが「主作用」なのですから、それを「副作用」とよぶのは無理があるのではないでしょうか。

おそらくプログラミングにおける「副作用」、すなわち「状態の変化」を意味する言葉が流用されてしまったのだと思いますが、いずれにせよ、HTTPの仕様書に「副作用」の定義がないのは、なんとも不親切だと感じました。

以上のようなことを考えたきっかけは、徳丸さん(@ockeghem)による下記のツイートです。

副作用という用語はいつも使っていいか悩む。パスワード変更機能において、パスワードが変更されることが副作用で、「パスワードが変更されました」という表示が主作用(とは言わないが)というのは、直感に反する

徳丸 浩 on Twitter: "副作用という用語はいつも使っていいか悩む。パスワード変更機能において、パスワードが変更されることが副作用で、「パスワードが変更されました」という表示が主作用(とは言わないが)というのは、直感に反する"

セキュリティの文脈なので話が若干違うのかもしれませんが、このツイートを読んだときの僕の直感は、「パスワードが変更されること」こそが POST の主作用で、その処理結果がレスポンスボディに記される、というものでした。急に画面デザインが変わったり、サーバのCDトレイが開いたりするのが「副作用」のイメージ。

「リソースの状態に変化を与えること」を「副作用」以外の言葉で表せるといいんでしょうけれど、難しいですね。「リソース変化作用」じゃ長いかなあ。