2012年7月15日日曜日

変態で学ぶ副作用

変態アドベントカレンダー in Summer(http://atnd.org/events/29918) 初日です。

今回は、変態を例にとって副作用について考えてみましょう。

一般的に副作用というと、お薬を連想しますね。
風邪薬を飲むと眠くなるとか、熱を抑える薬だけどその代わり少し吐き気がするかもしれないとか、そういうことです。

プログラミングにおいてもこの副作用というものは存在します。
wikipediaによると、「ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう」とあります。

副作用のあるメソッドは、その状態によって結果が変わるため、呼び出しには注意が必要なのです。例を見てみましょう。

まずは副作用のあるプログラムの場合。


Hentaiクラスがあります。この変態は、case classとなっており、クラスを生成するタイミングでSかMかの状態を列挙型で受け取ります。

slapメソッドを実行すると、この変態に対して平手打ちを実行するわけですが、ご覧のとおりクラスを生成する際に決定される状態により、結果が変わります。

val h = Hentai(SMKind.M) と宣言してから h.slap を実行すると、この変態は「もっと!!!」と変態じみた結果を返します。
一方、 val h = Hentai(SMKind.S)と宣言してからh.slapを実行すると、この変態は「てめぇ、なにするんだ!」とあろうことかマジギレしてしまいます。

このHentaiクラスの宣言部が、呼び出し部から離れたところで行われていた場合、この変態に平手打ちをかましたときに喜ばれるのか、キレられるのか、わかりません。

これでは怖くて、とてもじゃないですがこの変態に気軽に平手打ちなどできません。

では下記のコードではどうでしょうか。

このパターンでは、HentaiオブジェクトにそれぞれS用の平手打ち、M用の平手打ちが別々に定義されています。これらの結果は、状態に依存することはありません。

我々は気軽に、Hentai.slapToMと実行してこの変態を喜ばせてあげることができます。

これが副作用のないプログラムです。安心ですね。

と、いうことで明日は「真っ赤なレモン」さんですね。
よろしくお願いします。

0 件のコメント:

コメントを投稿