0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サブルーチン。プロシージャ(手続き)・ファンクション(関数)。クラス・メソッド。たぶん、きっかけは変数をバグらせない進化

Last updated at Posted at 2022-02-23

プログラミング言語の関数は「返却値の有無、引数の有無」の4種類。

ですが、僕自身の中では「関数」とは「数学の関数 y=f(x) 」と同義あり、返却値のないものを「関数」と呼ぶことに違和感を抱いていました。

なぜそんな違和感を抱くのか?
それは僕がMSX BASICのサブルーチン生まれの、VB6/VBAのSub/Functionや、Delphiのprocedure/functionでも育ったこともあるからだったようです。
明確に「関数 y=f(x) じゃないものは、プロシージャや!!」と・・・
それはさておき・・・

JavaScriptでいうところの関数を人に教えることになって、冒頭の「関数の4種類」を教えれば良いとは思いつつも、その後、オブジェクト指向にも展開していくだろうし、その時に関数とメソッドの違いをどう説明するんよ・・・と思いました。
そういえば、人に教える話として サブルーチン。プロシージャ(手続き)・ファンクション(関数)。クラス・メソッド。の違い を明確に意識できていなかったので、それらが生まれた 「変数を如何にバグらせないか」 のプログラミング言語の歴史的経緯を軸に、頭の整理をしてみたメモです。


グローバル変数だけの世界:どこでもどんな処理でも変数触り放題

サブルーチン:

同じ処理(ルーチン、ルーティーン)をするだけ。引数を渡すとかの考えはない。
処理の中で変数を変更するとすれば、その変数はグローバル的なもの。(関数でいうところの「副作用」)
(ぶっきらぼうにいうと、変数=メモリ管理でいうと、アセンブラでやれることと変わらない。)

なんでもグローバルやばい。人のところ勝手に触れちゃった

処理の単位で変数のスコープを限定させよう・・・処理(手続き・関数)の中の変数は、その外側への影響なくせるわ

プロシージャ:手続き

処理の塊、処理結果の返却はしない
引数も取りうる。(引数なしの場合はサブルーチンと言える?)
副作用が生じるかどうかは、内容次第

ファンクション:関数

関数、処理結果の返却をする
引数も取りうる
副作用が生じるかどうかは、内容次第

処理途中の変数とか無くなったな。変数も構造体とかで「データの塊」はできてるけど・・・
・・・うーん、誰かがどっかで勝手に処理を呼び出したりして、まだ勝手に触れちゃう・・・

そや、見えへんようにしたろ。触ってほしい処理だけ公開したろ

クラスとメソッド:

変数とプロシージャとファンクションを隠蔽して塊にして、その塊の外側からは、変数の変更や処理を呼び出せないようにした。意図している公開した処理を呼び出してもらうことだけはできる。


言いながら・・・

やっぱり処理が遅くなったりするし、致し方ないこともあるから、 やっぱ外から見たり変更できる変数も作れるようにしとこ というのがあります。
それはそれで必要です。

ですが、ここまでの言語の進化(変数を守れ!)を理解せずに、変数を守るための手法を使わずに、簡単に見えちゃう・触れちゃうもので「お!手っ取り早いやん・・・」って使ってしまって、バグ・バグりやすいプログラムを作ってしまったり・・・


(これ以降のプログラミング言語の進化は勉強不足・・・)
(これらそれぞれで例となるプログラムがあると良いけどry)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?