今回は、変態を例にとって副作用について考えてみましょう。
一般的に副作用というと、お薬を連想しますね。
風邪薬を飲むと眠くなるとか、熱を抑える薬だけどその代わり少し吐き気がするかもしれないとか、そういうことです。
プログラミングにおいてもこの副作用というものは存在します。
wikipediaによると、「ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう」とあります。
副作用のあるメソッドは、その状態によって結果が変わるため、呼び出しには注意が必要なのです。例を見てみましょう。
まずは副作用のあるプログラムの場合。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class Hentai(val smKind: SMKind.Type) { | |
def slap = { | |
smKind match { | |
case SMKind.S => "てめぇ、なにするんだ!" | |
case SMKind.M => "もっと!!!" | |
} | |
} | |
} | |
object SMKind extends Enumeration { | |
type Type = Value | |
val S = Value(1, "サド") | |
val M = Value(2, "マゾ") | |
} |
Hentaiクラスがあります。この変態は、case classとなっており、クラスを生成するタイミングでSかMかの状態を列挙型で受け取ります。
slapメソッドを実行すると、この変態に対して平手打ちを実行するわけですが、ご覧のとおりクラスを生成する際に決定される状態により、結果が変わります。
val h = Hentai(SMKind.M) と宣言してから h.slap を実行すると、この変態は「もっと!!!」と変態じみた結果を返します。
一方、 val h = Hentai(SMKind.S)と宣言してからh.slapを実行すると、この変態は「てめぇ、なにするんだ!」とあろうことかマジギレしてしまいます。
このHentaiクラスの宣言部が、呼び出し部から離れたところで行われていた場合、この変態に平手打ちをかましたときに喜ばれるのか、キレられるのか、わかりません。
これでは怖くて、とてもじゃないですがこの変態に気軽に平手打ちなどできません。
では下記のコードではどうでしょうか。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object Hentai { | |
def slapToS = "てめぇ、なにするんだ!" | |
def slapToM = "もっと!!!" | |
} |
我々は気軽に、Hentai.slapToMと実行してこの変態を喜ばせてあげることができます。
これが副作用のないプログラムです。安心ですね。
と、いうことで明日は「真っ赤なレモン」さんですね。
よろしくお願いします。
0 件のコメント:
コメントを投稿