00:05
こんにちは、ながおかのプログラミングチャンネルです。
今回は副作用というプログラミングの考え方、言葉についてちょっと説明したいと思います。
よく使い方、この言葉の使い方としては、関数型言語は副作用がないであったり、副作用がないことで参照透過性があってテストがしやすいとかバグが起きにくいとかそういった使い方をします。
じゃあこの副作用、英語で言うとサイドエフェクトですね、とは何なのかというのをちょっと話していきたいと思います。
ちなみにこの副作用サイドエフェクトというのは、薬の副作用とも言葉としては一緒なんですが、意味としてはちょっと違います。
副作用の話をしていく中で、関数型言語という話もちょっと出てきたりしましたが、
もう一つ別のパラダイム、考え方、プログラミングにおける考え方をお話ししたいと思います。
それはオブジェクト思考という考え方です。
これはオブジェクト思考については、今回関数型言語ではなくて副作用との比較のためにあくまで出しているので、
関数副作用はこういうことですという説明だけだと分かりにくいので、オブジェクト思考というものとの違いを比較しながら説明したいと思います。
なのでオブジェクト思考の説明は簡単にですがします。
そして副作用がないというのは、オブジェクト思考のこういった状態がこう違うんですよというような感じで比較対象として使っていきたいと思います。
オブジェクト思考というのはまず何かというと、オブジェクトというものがあると考えます。
そのオブジェクトというのはデータとメソッドというのを持っているんですね。
データというのは、例えば本というオブジェクトを考えると、本は例えばページ数であったり出版社であったり著者であったり、あと内容もそうですけどデータを持っていると。
メソッドというのを持っています。
このメソッドというのはオブジェクトが何をするか。
基本的にオブジェクトが主語なので、例えば本であれば自発的に何かをするというのは本なのであまりイメージしにくいんですが、ちょっと無理やりですが、
例えば読まれるとか買われるとか本屋さんに並ぶとか、そういったデータとメソッドというものの2つを持っています、オブジェクトが。
オブジェクト思考の考え方というのはイメージしてもらうと、オブジェクトの持つデータをメソッドによって操作していくという考え方なんですね。
例えば本、また10ページの本があるとして、じゃあ今日ちょっと読み始めて1ページ読み終わったと、だからここにしおり挟んでおこうと。
03:00
しおり挟みます。
なのでオブジェクトの中のデータのところに1ページ目にしおりがあるというデータを持っておくと。
次の日また1ページ読んだらしおりを2ページ目のところに移すと。
読んで3ページしおりをどんどん移していく。
これしおりの位置というデータをオブジェクトが持っているわけですね。
これを副作用が起きていると言います。
どういうことかというと、1ページ読むという操作、メソッドでしおりの位置が変わるというオブジェクトの状態の変化が起きてしまっていると。
なので1ページ進むという操作をしたときに、しおりの位置が例えば1ページ目にあるときだったらしおりは2ページ目になりますけど、
4ページ目にしおりがあるときだったら次の状態って5ページ目にあるわけですね。
だから中の状態によって結果が変わってしまう。
しおりがもともとある位置によって結果が変わるという。
これを副作用というか副作用があるがゆえの結果が違うことによってバグが起こりやすいということになります。
副作用というのは中の内部状態が変化してしまうということを言います。
次に副作用がないという話なんですが、こういったものがない、こういうものを一切なくすということです。
具体例をちょっとまた挙げたいと思うんですが、具体的に例えば本で言えば、
現実世界とは少しイメージとしては変わってしまうかもしれないんですが、
読んだページを破ってしまう。
10ページの本で読み終わったページをビリッと破って9ページの本になってしまう。
そうすると何が起こるかというと新しい本が出てくると考えるんですね。
だから10ページの本を読んだら9ページになった。新しい本が出てきた。
本に内部状態というものは存在しないわけです。
しおりの位置というデータはない。
10ページの本を読んだら、読んだページを破って新しい本になったからそれで終わり。
特にしおりの位置によって変わるとかもない。
9ページの本を読んだら、また読んだページを破ったら新しい本が出てくるだけなので、特に内部状態というものはない。
さらに同じ10ページの本を入れたら読んだページが、一番最初のページが破りそられて、一枚破られて出てくるだけなので、何回やっても同じ。
内部状態とか特にないので。
これが回復作用がない状態ということを言います。
だから内部状態、そのオブジェクトを思考におけるオブジェクトのデータ、内部の状態というものが存在しないので、
06:04
何回やっても何回同じものを渡しても絶対に毎回同じ答えが返ってくる。
なので、これがバグが起こりにくいであったり、何が行われているのかが確認しやすいと呼ばれる理由になっています。
というわけで今回は複作用の説明でした。
またちょっとここが分かりにくかったとか、あともうちょっとこの説明をしてほしいなら、ぜひレターやコメントでお願いします。
また、いいねやフォローもぜひお願いします。
あと長プロで感想とかもいただけると嬉しいです。ありがとうございました。