constと副作用とワイ


35歳無職ワイ

ワイ「今日はやることないからJavaScriptのお勉強でもしよか」
ワイ「なんかしとらんと酒飲んでまうからな」

ES2015のお勉強

ワイ「ほな新しめのJavaScriptであるES2015のお勉強でもしてみよか」
ワイ「ES2015入門・・・検索、と」

ワイ「お、ワイの大好きな人斬りエンジニア塾はんのサイトが出てきたで」
ワイ「ほな読んでいこか」

ワイ「ほー、ES2015ではconstいうんを使って定数を宣言できるんか」

const a = 3;
a = 4; // エラー!

ワイ「constで宣言した定数は、再代入が出来ひんようになっとるから、」
ワイ「一度数値文字列を代入したらその後はずっと同じ値である事が保証されてんねんな」

再代入できないと何が嬉しい?

ワイ「うーん、でも別にconstなんて無くてもプログラムなんて書けそうやけどなあ」
ワイ「むしろ再代入できるほうが便利やないか?」
ワイ「constはどんな時に役立つんやろか・・・」
ワイ「値が変わらんことが保証されとると便利なとき・・・」
ワイ「どんな時や・・・」

こんな時にconstは役に立つ

ワイ「せや」
ワイ「こんな時に役に立ちそうやな」

const a = 3;

change_the_world();
reset_something();
destroy_all();

console.log(a); // 何が表示される?

ワイ「定数 a が宣言された後に色んな関数が実行されとるけど、aの値が3やって事は保証されとるから分かりやすいな」
ワイ「3に決まってんねんもん」

ワイ「これがもしvarletで宣言した変数やったら」

ワイ「change_the_worldっていう関数はなんや?」
ワイ「aの値をなんか変えてるんちゃうか?
ワイ「reset_somethingって何?」
ワイ「なんかaに影響あたえてるんちゃう?
ワイ「destroy_allって何?」
ワイ「明らかに全てを破壊しそうやん・・・」
ワイ「ていうかさっきからどんな命名してんねん!!!

ワイ「って色々と心配になってお酒を飲んでしまったり
ワイ「それぞれの関数の中を見に行ったりせなあかんけど」
ワイ「aに再代入されない事が保証されてるなら安心やもんな」
ワイ「それはconstで宣言するメリットかもな」
ワイ「なにかの関数の副作用知らん間にaの値が変わっとった!!!いうことが無いからな」

ワイ「基本的になんでもconstで宣言して、再代入が必要なやつだけletにしといたら良さげやな」
ワイ「varletの下位互換みたいなもんやから、もう要らんやろ」
ワイ「varはもう仕様から削除してほしいわ」

オカン「そらええな」
オカン「削除したらお前が昨日まで書いとったコード動かへんくなるけどな!

ワイ「せ、せやな」

しかし気になること

ワイ「でも、ワイみたいなザコーダーやと、」
ワイ「constで宣言するのを忘れて、クセでvarを使ってしまうかもしれんから」
ワイ「一抹の不安が残るな・・・」

ワイ「あと」

const arr = [3, 4, 5];
arr.push(6); // エラーにならない。

ワイ「こんな感じで」
ワイ「constで宣言してても配列への要素追加とかは出来てまうんやな・・・」
ワイ「ほな、なんかの処理の副作用で、」
ワイ「配列の中身が知らん間に変わってまうかもしれんな・・・」
ワイ「あとオブジェクトのプロパティも変更できるねんな
ワイ「再代入が出来ひんだけであって、完全にイミュータブル(不変)な訳やないんやな」
ワイ「むぅ」
ワイ「その点も不安やな・・・」

ワイ「不安やから、酒飲んどこ・・・」

〜飲酒、そして就寝へ〜

翌朝

ワイ「今日はやる事ないから純粋関数型言語Elmのお勉強でもしよか」

ワイ「なになに」
ワイ「ふむふむ」
ワイ「え・・・」

ワイ「Elmではそもそも再代入する術がないんか」

x = 3

ワイ「こう書くだけでもう不変やって。」
ワイ「もし再代入しようとしたら、」

Elmちゃん「名前の衝突です。」
Elmちゃん「このファイルは複数のx宣言を持ちます。
Elmちゃん「どのようにして欲しいのですか?
Elmちゃん「それらの1つを改名しなさい!

ワイ「ってコンパイルエラー起きんねんて。」
ワイ「ドMのワイにはたまらんで
ワイ「もう再代入やなくて名前の衝突やねんな」
ワイ「再代入いう概念がないねんな」

ワイ「ほな普通に書いとくだけで、」
ワイ「なんかの処理の副作用知らんうちに値を変えてもうとったわ!!!
ワイ「って事がないんやな」

ワイ「あと配列・・・やなくてListか」
ワイ「リストに要素を追加しようとしてもそれは新しく別のリストが作られる感じになるから」
ワイ「元のリストはちゃんと残っとるんやな」
ワイ「JSのconstみたいな心配も大丈夫、いうわけやな」

ワイ「ほかにも」
ワイ「なんかをアレしたら、知らん間に他のなんかも変えてもうとった!!!
ワイ「みたいな副作用が極力発生せんように言語自体が作られてんねんなー」

ワイ「しかも最終的にはJSにコンパイルされるんやって」
ワイ「間違って副作用を起こす事が少ない純粋関数型言語でフロントエンド開発ができんねんなー」

15時になったのでお勉強終了

ワイ「昨日は、変数の値が変わってしまわへんか心配になってお酒を飲んでしもうたけど」
ワイ「今日はそんなことあらへん」
ワイ「今日は祝杯や
ワイ「新しい言語との出会いにな」

オカン「結局飲むんやないか

〜おしまい〜