2015年2月3日火曜日

構造化とオブジェクト指向と関数型と

最近さる場所で関数型言語のうんぬんで炎上したという話を聞きました。

それとは全く関係ありませんが、
自分の中ではどうなのかと思いまとめてみることにしました。
(この記事の内容はかなり誤りなので、初心者は信じないようにお願いします。)

構造化プログラミングと言ったら、
エドガー・ダイクストラの構造化定理という分かりやすい指標があります。

EWD249に原文がありますので、
構造化プログラミングを所持していないのであれば翻訳してみましょう。
(自分はプレミア価格覚悟で買いました…まだ英語はニントモカントモ。)

詳細はどさっと省いて、
重要なのは小さな処理単位でないと正しいことを証明するのが大変だってことです。

だから関数なりサブルーチンなりという小さな処理単位を作り、
その中の正しさを証明することでプログラムが確実に動作する領域を増やします。

よく長ーい関数を書いて批判を浴びる方が居ますが、
ソフトウェア工学的にはこういう意味で批判されているわけです。

長い関数はまるまる大きな不安定領域を作ってしまっているわけですが、
ここでの説明で理解されるようならとっくに過ちに気づいているという悲劇。

ちなみに関数のインターフェースや中身、大きさについて語っているに過ぎないので、
別にオブジェクト指向や関数型と反発する内容ではありません。

 

オブジェクト指向は…どこを基準にすれば良いのでしょうか。

オブジェクト指向入門でも出しとけばいいんでしょうか。(適当)

GoFは読みましたがこちらはまだ読んでないのでかなり適当度が増してます。

基本的には状態(メンバ変数)と振る舞い(関数)合わせ、
ひとつの単位(オブジェクト)として扱うとうま味ってことです。

日時を扱うなら日時の構造体と関数がセットになっていた方が楽ってものです。

あ、でも日付だけや時刻だけを扱ったり、両方同時扱うときもあって…

そんなオブジェクトを表現するのに便利な機能が揃っているのが、
オブジェクト指向言語ってわけです。

C言語でもオブジェクト指向ができるという話は、
便利な機能が無いから大変だけど出来なくもないということです。

 

でまあ関数型に入るわけですが、
オブジェクト指向プログラミング向けにわざとおかしい説明でいきましょう。

え?解説書?魔術師本でええやん。

さて、さっき状態と振る舞いを融合してオブジェクトとしましたが、
この範囲をもっと広げます。

状態と振る舞いのどちらかが無くてもオブジェクトでいいやと考えるのです。

そしたら引数にはオブジェクトが使えるので、
引数に関数を入れても構わなくなります。

そして関数はオブジェクトを返すことができるので、
関数を返したって構わないのです。

このあたりを突き詰めたのが関数型プログラミングです。

そして状態が無いということは、
とっても大きな利点があります。

純粋な関数型の領域であばれる分には、
同じ引数に対して同じ戻り値であることが保証されるのです。

これが(たぶん)副作用が無いってやつなんですが、
現実には副作用がある処理もいっぱいあります。

しかしここで構造化プログラミングを思い出してください。

構造化するのは動作が正しいことを証明しやすくするためでした。

つまり副作用がない箇所と副作用がある箇所を分けることで、
また違った形で動作が正しいことを証明しやすくしているのです。

 

…改めて書くと、適当な理解ですねぇ。(自虐)

0 件のコメント:

コメントを投稿