プログラミングの思想の話です。タイトルが言いたいことのすべてで、わかる人はこれだけで伝わると思いますし、このタイトルだけでそれはないと思う人もいると思います。
用語説明
staticおじさんとは
オブジェクト指向が流行していた2010年に一つのブログ記事がありました。
その記事はオブジェクト指向の使われ方に関して意見を述べたもので、ものすごく省略して書くと、クラスメソッドはできるだけstaticで書くべき、みたいな内容です。
そして、この記事のコメント欄では非常に活発な議論がなされました。
この議論やりとりの流れでなんにでもstaticをつける人、あるいはオブジェクト指向を理解しない人を「staticおじさん」と侮蔑的に呼ぶ風潮が一部でできました。
つまり「staticおじさん」とはオブジェクト指向崇拝者がそうでない人を侮辱する蔑称です。
※念のため記載すると、どちらかと言えばですが、タイトルの通り私は「staticおじさん」を擁護する立場です。
const教とは
Javascriptでは変数を「const」で宣言することで再代入不可の変数として作成することができます。変数にどんな型でも代入できてしまうJavascriptでは「const」は重宝され、やがて信者が生まれました。再代入可能な宣言方法のletやvarを排除しようとする「const教」です。彼らはときに無茶をしてでも「const」のみを使おうとします。
関数型プログラミングとは
上記の2つと異なり、正式な用語です。
プログラミングパラダイムの一つであり、オブジェクト指向とよく比較されるものですが、厳密にいえば排反関係にあるものではないようです。
関数型プログラミングは関数を変数と同じように扱う、という説明がなされることがありますが、ここでいう関数とは数学的な意味の関数に近いものです。つまり、同一の入力に対しては必ず同一の値を返す処理(純粋関数)を多用する、というニュアンスです。
正確な説明をすることは難しいので、const教やstaticおじさんと同じ考えと思ってもらうのが良いかと思います。さすがに雑かもしれませんが。
なぜ3者は同じ派閥なのか
staticおじさん、const教、関数型プログラミングは参照透過性を優先するという点で共通しています。参照透過性とは同一の入力に対して同一の作用と同一の出力をする性質のことです。具体的には変数を再代入不可にすることと、純粋関数を使用することで参照透過性の高いプログラムになります。
反対にクラスの変数が変わったりすること(=副作用)が発生すると参照透過性のないプログラムになります。
関数型プログラミングとオブジェクト指向で異なっているのはデータ・状態変数に対する方です。プログラムは結局のところ処理とデータの組み合わせで成立しています。
関数型では処理とデータをそれぞれ分離した階層構造で管理しており、一方のオブジェクト指向では処理と変数を一体としたものを階層構造で管理しています。大体こんな感じのイメージです。
関数型プログラミングの構造イメージ
オブジェクト指向の構造イメージ
さいごに
それぞれについて論じている記事やstaticおじさんと関数型プログラミングを紐づけた文はそこそこ見かけますが、そこにconst教を関連付けている文章はみかけなかったので記載してみました。
私はこの辺の厳密性はあまり気にしていませんが、うるさい人はうるさいという印象です。
もちろん関数型プログラミングは学術的には他の2者とは全く異なるものですが、近代的なマルチパラダイム言語を使う範疇であればそれほど別種のものと捉える必要はないと思っています。
オブジェクト指向ではなく、データ指向に近いよーという感じです。
コメント