プログラミング言語の関数は「返却値の有無、引数の有無」の4種類。
ですが、僕自身の中では「関数」とは「数学の関数 y=f(x) 」と同義あり、返却値のないものを「関数」と呼ぶことに違和感を抱いていました。
なぜそんな違和感を抱くのか?
それは僕がMSX BASICのサブルーチン生まれの、VB6/VBAのSub/Functionや、Delphiのprocedure/functionでも育ったこともあるからだったようです。
明確に「関数 y=f(x) じゃないものは、プロシージャや!!」と・・・
それはさておき・・・
JavaScriptでいうところの関数を人に教えることになって、冒頭の「関数の4種類」を教えれば良いとは思いつつも、その後、オブジェクト指向にも展開していくだろうし、その時に関数とメソッドの違いをどう説明するんよ・・・と思いました。
そういえば、人に教える話として サブルーチン。プロシージャ(手続き)・ファンクション(関数)。クラス・メソッド。の違い を明確に意識できていなかったので、それらが生まれた 「変数を如何にバグらせないか」 のプログラミング言語の歴史的経緯を軸に、頭の整理をしてみたメモです。
グローバル変数だけの世界:どこでもどんな処理でも変数触り放題
サブルーチン:
同じ処理(ルーチン、ルーティーン)をするだけ。引数を渡すとかの考えはない。
処理の中で変数を変更するとすれば、その変数はグローバル的なもの。(関数でいうところの「副作用」)
(ぶっきらぼうにいうと、変数=メモリ管理でいうと、アセンブラでやれることと変わらない。)
↓
なんでもグローバルやばい。人のところ勝手に触れちゃった
↓
処理の単位で変数のスコープを限定させよう・・・処理(手続き・関数)の中の変数は、その外側への影響なくせるわ
プロシージャ:手続き
処理の塊、処理結果の返却はしない
引数も取りうる。(引数なしの場合はサブルーチンと言える?)
副作用が生じるかどうかは、内容次第
ファンクション:関数
関数、処理結果の返却をする
引数も取りうる
副作用が生じるかどうかは、内容次第
↓
処理途中の変数とか無くなったな。変数も構造体とかで「データの塊」はできてるけど・・・
・・・うーん、誰かがどっかで勝手に処理を呼び出したりして、まだ勝手に触れちゃう・・・
↓
そや、見えへんようにしたろ。触ってほしい処理だけ公開したろ
クラスとメソッド:
変数とプロシージャとファンクションを隠蔽して塊にして、その塊の外側からは、変数の変更や処理を呼び出せないようにした。意図している公開した処理を呼び出してもらうことだけはできる。
言いながら・・・
やっぱり処理が遅くなったりするし、致し方ないこともあるから、 やっぱ外から見たり変更できる変数も作れるようにしとこ というのがあります。
それはそれで必要です。
ですが、ここまでの言語の進化(変数を守れ!)を理解せずに、変数を守るための手法を使わずに、簡単に見えちゃう・触れちゃうもので「お!手っ取り早いやん・・・」って使ってしまって、バグ・バグりやすいプログラムを作ってしまったり・・・
(これ以降のプログラミング言語の進化は勉強不足・・・)
(これらそれぞれで例となるプログラムがあると良いけどry)