なぜデータと処理を近づけたいのか

オブジェクト指向の概念に「カプセル化」というものがある。情報と処理をひとまとめにするというものだ。一般的なオブジェクト指向プログラム言語であれば、この概念をクラスを使って実現する。そして、処理を通してしか情報にアクセスできないようにするのが一般的だ。
と、まぁ、ここまではどんな本にでも書いてある。ここでは、なぜデータと処理を近づけたいのかを説明してみる。おそらく、調べれば解はたくさん見つかるだろうが、あえて自分なりの解を求めることにする。
自分では別の解を求めるように言っておきながら、「解を一つにする」というのがカプセル化によって実現している一つのことではないだろうか。一つ抽象度を上げるといってもよいかもしれない。
データ構造に配列を使おうが、リストを使おうが、スタックを実現する事は可能である。スタックの仕様も色々あるが、ここでは、スタックにデータを積むpush、データを取り去るpop、一番上に積まれているデータの値を調べるtopがあるものとする。このような仕様のスタックを配列を使って実現するならば、持つべき情報としては、データそのものの他に、「あらたなデータを追加する場所を示すインデックス」、または「最後に追加したデータの場所を示すインデックス」、「現在入っているデータの数」が必要になるだろう。この2つインデックスとデータの数は、どれか一つが分かっていれば導出(計算によって導き出される)可能である。その際に配列が0始まりか、1始まりかを考慮することも大事だろう。
さて、この3つ情報のうち皆さんは、どれを持つことにするだろうか?
どうだろう、どれにするか迷いは生じなかっただろうか。これはいわゆる設計判断というものだが、このような迷いがあるということは、それだけミスが発生する可能性もあるということだ。では、なぜ設計判断をしなくてはならなかったのだろう。それは、データを扱う方法に自由度があったからに他ならない。この自由度を下げてさえやれば、迷いは減るに違いない。そこで、データそばにそのデータを扱う処理をおいてやる。これだけでは正直強制力はないが、かなりのマインドコントロールが出来る。例えば、目の前に活きのいい魚と、刺身用の包丁、わさびが用意されていたとしよう、そして「料理してくれ」と頼まれたら、このような状況でどのような行動をとる人が多いだろうか。半数以上の人が、刺身にしなくてはならないと思うのではないだろうか。わざわざなべを用意して煮魚を作る人はそうはいないだろう。そうなったらこっちの思う壷*1である。データを隠しているわけではないが、データと処理を近づけるだけで、処理を再発明させようという気が起こらなくなる可能性が向上する。それだけ、余計なミスを減らすことが出来るのだ。さらにデータを専用の処理を通してしかアクセスできないようにすれば、強制力が増し、スタックの例であれば、すでに積まれているデータの中段にデータを挿入することも出来なくなるので、スタックとしての本来の動作も保護することが出来るのだ。
(うーん、いまいち。いつか推敲します)

*1:id:akonさんの壷とは違うはず