2014/07/23
先ずデータありき
前エントリ「プログラムは書いたとおりに動くのか」について、 一部「ああ、データ構造+アルゴリズム=プログラムってことね」というような反応があったんだけど、ちょっと違う。
プログラマ的視点における「データ構造+アルゴリズム」では、プログラマが問題にふさわしいデータ構造を決めるって意識だと思うんだけど、あのエントリで言いたかったのは、プログラマが考え出す前に既にデータそのものがあるってこと。
もちろん何らかの構造を決めないとコードでは扱えないんで、データ構造は作るんだけど、それは無から自由に作るもんじゃなくて、既にある塊の中にある構造の一面を切り出す、みたいな作業になる。まあ、それが結局モデル化って呼ばれる作業なんだけど、しばしばこのモデル化ってのが、具体的なインスタンスからイデアあるいはアーキタイプを見出す作業のようにとらえられてるんじゃないかって気がする。
目前にある具体的なデータは、ある「元型」が具象化したものだから、その「元型」を見つけましょう、それをクラスなり型なりとして記述しましょう、というアプローチ。
でも現実のプログラムの多くはそうじゃないんじゃないか、ってのが言いたかったこと。現実のデータに「元型」なんてなくて、データはデータとしてごちゃっとそこにある。プログラマが設定するクラスなり型はあくまでその混沌を一つの投影面に射影して何とか扱えるようにした暫定的なもので、別の目的なら全く違った型が見えるかもしれない。でもそれぞれが触るインスタンスは同じ具体物だ。本来の情報の流れはインスタンス→クラス、であって、イデアたるクラスが大元にあってインスタンスを産み出しているわけではない。プログラムコードとしてはクラスからインスタンスを作ってるんだけど、それは便宜上そうしてるだけ、って感覚を主張したかった。
んで、このデータっていうのはプログラムより前からそこに存在するだけでなく、プログラムの都合とは関係なしに変化する。それに伴って構造も変化する。
データ構造が先にありき、の感覚だと、変更を主導するのはプログラマだ。けれど、データが先にあるという感覚だと、データ構造は常に暫定的であり、データが変化したらすいっと構造の方を追従させてゆく必要がある。変化については、能動的なのはデータであり、受動的なのがデータ構造を含めたコードなのだ。
一部のプログラミング言語では、実行中にクラス定義を変えたり、 インスタンスが属するクラスを全く違うものにすげ替えたりできる。 これは静的な検証という観点からは最悪の機能だ。だってT型のデータを受け取って、 それをT型を期待する引数に渡すってコードがあっても、その間にデータ自体の型が S型に変化する可能性があるのだから。
でも、特定の設計の適用範囲よりもデータの方が長生きする、という立場に立った場合、 目前にある混沌としたデータをとりあえず触れる形にしておいて、 必要に応じて表現を動的に変えてゆく、 プログラムコードは常にその時点の暫定版に過ぎない、 という見方も可能なのだ。
(別に静的型をdisってるわけじゃなくて、立場の違いってこと。 なお、上で述べたような「混沌としたデータが、投影法によって違うものに見える」 というのは、型クラスとかtraitのような仕組みと相性が良いと思う。)
Tag: Programming
Post a comment