このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

メイヤー流の契約となんでもケーキ屋さん

昨日の記事の補足。

メイヤー流の契約とは、ホーアの表明の変種に過ぎません。しかし、それを提供者(業者)と顧客のあいだの約束事という比喩を使った点がメイヤー先生の秀逸なアイデアです。そもそもメイヤー先生は比喩が大好きで、ときに牧場の牛だのカタマラン・ヨットだのと無理筋になってしまうこともあるのです。

今日は僕もメイヤー先生にならって、提供者にとって契約がきびしくなることについて、かなり強引な例え話をしてみます。

入力は持ち込みの素材、出力はケーキ

すこし前に野菜を使ったケーキが話題になりましたが、柿沢安耶さんお店はウチの近くです。例え話として、いろんな素材からケーキを作ってしまう架空のお菓子屋さんを考えます。

お客さんが何かしら素材を持ってくると、それからケーキを作ってしまう、というサービスがあるとしましょう。このサービスの要点をメイヤー流の契約で書けば、fがケーキを作る作業だとして require x∈(素材の集合) do f ensure f(x)∈(ケーキの集合) となります*1

茄子と味噌からケーキは出来るか

お客さんが持ってくる素材xがイチゴやオレンジなら、ケーキにするのは難しくないでしょう。トマトやパセリでも柿沢さんならケーキにしてしまいます。では、茄子と味噌が持ち込まれたらどうでしょうか? これは漬物の素材ですよね。

ひとつの対応案は、「それは無理です」とお断りすることです。素材として許す範囲を「果物に限る」とでもすれば、あまり無理難題にはならないでしょう。つまり、入力の範囲を狭くすれば、提供者はそれだけ仕事が楽になるのです。

とはいえ、受け付ける素材があまりに限定的では、サービスとしての質が低いとみなされるかもしれません。茄子と味噌からケーキを作るのは容易ではないでしょうが、それが出来ればお客さんは喜ぶでしょう。一般に、入力の範囲を広げることは、提供者の負担を増やしますが、顧客からは喜ばれることなのです。

茄子と味噌なら漬物がふさわしいか

素材として許容できる集合に茄子と味噌も入っているとして、お客さんが茄子と味噌を持ち込んだとき、いっそ漬物にして返してはどうでしょうか? いや、契約は require x∈(素材の集合) do f ensure f(x)∈(ケーキの集合) でした。出力はケーキの集合に入っていることがお約束です。漬物はケーキの集合に入らないでしょう。つまり、契約違反です。

ケーキの集合を食品の集合に置き換えた契約 require x∈(素材の集合) do f ensure f(x)∈(食品の集合) ならば、漬物だろうが味噌汁だろうが田楽だろうがOKです。出力の集合が大きくなれば、提供者にとってゆるい契約となります。

卵は誰が準備する

必須だった入力がオプショナルに変わったとき、入力の集合が小さくなったと誤解する人がかなりいます。それはまったくの間違いです。逆です! 入力の集合は大きくなるのです。したがって、機能・サービスの提供者にとって条件はきびしくなります。

例えば、ケーキの素材として「必ず卵をご持参ください」としている場合、卵の準備はお客さんの責任となります。ケーキ屋さんは卵を調達する必要はありません。それを、「卵を持ってこなくてもいい」とすれば、ケーキ屋さんの負担は増えます。入力に関して「必須 → オプショナル」と変更すると、責任の一部が顧客から提供者に移ります。

と言っても、「入力の集合は大きくなる」点が納得できないかも知れませんね。計算科学では、「入力が存在しない」ことを特殊な値⊥(bottom)として表現することがあります。例えば、整数の集合 {1, 2, 3} が入力だったのをオプショナルにすると、入力の集合は {1, 2, 3, ⊥} と⊥の分だけ大きくなるのです。顧客から見ると、入力の選択肢が「入力しない」も含めて増えることになります。


たわいもない例え話でしたが、メイヤー流の契約に多少なりとも親しみを持っていただければ幸いです。

*1:後で「茄子と味噌」とか出てくるので、素材は複合物となり、素材の集合の定義はそれほど簡単ではありません。が、例え話なのでうるさいことは言わないことにします。