作者: 機械伯爵
日時: 2008/3/3(20:42)
 中身が同じなら同じというのなら、オブジェクト指向プログラミング言語
とか不要(いらん)よなぁ……な、機械す。

> なんか、メインが2〜3行しかないものだったと思います。
> 
> で、メインの中では別の所で宣言しているexecの成功/失敗の
> 判定程度と、失敗した時にイニシャライズ(を呼び出す宣言)
> くらいしか行っていない。
> 当然、イニシャライズ手続きそのものも、外部に定義されている。
> 
> execの宣言の所も、実際には別の所で定義している手続きを
> Do しているだけ。
> 
> イニシャライズはおろか、execそのものさえ外側で
> 宣言しているのに納得がイカンのですよ。
> 
> で、そのDoされている所を見に行くと、その手続きの
> 内部で、さらに別の所に宣言してある関数を呼び出して
> 戻り値を得ている。

 まぁ、その話を聞く以上は、あんまり必要あるかな、と思われる
処理ではありますが、ご本人が外に出したということは、そこで
思考を区切りたかったんでしょうね。
 
> >  ここでメタファが重要になります。
> > 
> >  サブプロシージャはブラックボックス化された手続きですので、
> > 「その中身」を考え
> > ることなく「何が起こるのか」を理解すればいいわけです。
> > 
> >  関数も同じく、結果の値(オブジェクト)と置き換えられると
> > 考えれば問題ありません。
> 
> この「メタファ」で言えば、詮ずるところは、どちらも
> 「ブラックボックス化」が狙いですよね?

 はい、その通りです。
 そしてブラックボックス化の目的は、「経過」でなく「結果」だけを
見る、という意味と考えて下さい。

> その上で、
> 
> > 私はPascalで独習してたこともあって、「手続き(プロシージャ)」
> > と「関数(ファンクション)」
> 
> を、「はっきりと意識して使い分け」るというのは、どういう感覚
> (考え方?)なのでしょうか?
> 
> あるいは、「手続き(プロシージャ)」と「関数(ファンクション)」
> を意識上で区分することによって「得られるメリット」とでも言えば
> いいのかな・・・。
> 
> 特に、
> 
> >  手続きは「命令」ですから、コードの中から外の何か(機器や、
> > 外部変数など)を操作するのが目的です。
> 
> >  それに対し、関数は関数の中でコードが完結しています。
> 
> この2つの違いは、
> 
> 「手続き」は挙動の遷移先であり、自分自身が動いてゆく感じ。
> 
> 「関数」は返り値だけを得るための問い合わせる感じで、
> 自分自身はそこに居座る感じ。
> 
> そんな風に感じましたが、「“自分自身が動いてゆく”必要が
> どうしてあるのか?」というのが、がよくわかりません。

 いえ、どちらもメインルーチンから動きません。

 出前で例えましょうか。

 自分トコに出前を取る(あるいは材料を渡して調理してもらう)の
が関数。

 だれかのトコに出前を頼む(あるいは材料を渡して調理してもらって、
その中身をどこかに届けてもらう)のが手続きって感じです。

 手続きは、自分トコには(間接的には来るでしょうが)直接的には結果が
返ってこないわけですから、投げっぱなしの処理になるわけです。

 あんまり私の好きでない言葉で言えば、手続きは「副作用を起こす」
サブルーチンです。

 ちなみにダイクストラ先生のやり方に従えば、副作用は必要最低限にして、
特にメインルーチンで使用する変数なんかが副作用で変更されるのは、
オブジェクトにメッセージを送った場合のように明示的でない限り、
するべきでないと考えます。

 つまり……

var = function(arg...)

 か、

procedure(arg...) ⇒ どっかが動いておしまい。

 だけでプログラムを書くと、分かり易い、という話です。
 
> やはり、「“自分自身が動いてゆく”必要がどうしてあるのか?」と。

 だから、動いちゃダメですぅ☆

 /機械伯爵/C言語は副作用ありすぎ……理由はあるんだろうけど/