言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ストリームクラスと抽象化の方針

ストリームは、プログラミング言語を問わずファイルアクセスや文字列の連結に良く使われている。その特徴は、限定された機能によく表れている。

  • ストリームは、読み書きの一方しか出来ない。
  • ストリームを読み書きできる位置は一箇所だけ。

この特徴によって、データのコピーを減らす事が出来るので、直接データ列を扱う事に比べてすっごい高い能率が得られる。また、実装の異なるデータ、ファイル、メモリ、ネットワークを同じインタフェースで利用する事により、可読性や再利用性も上がる。

Squeak にも Stream クラスが用意されているが、その実装は間違いなんじゃないかという主張。

Squeak の特徴は、型チェックが無い事にある。その特徴が Stream クラスにも表れていて、Stream クラスでは文字列やバイト列に限定されず、あらゆる集合をストリームとして操作出来る。これはとても強力である一方、次の問題を生む。

  • OrderedCollection (他の可変配列を表す仕組み) クラスとの役割分担が不明瞭。
  • ファイル操作やネットワークなど、バイト列のみを操作するクラスによって継承されているため、一般的な集合を扱える利点が少ない。
  • さらに文字コードや改行コードの変換を行うクラスによっても継承されているため再利用が制限される。

例えば .NET Framework ではこうなっている。

  • Stream はバイナリ列のみを扱う。
  • 継承しているのは、FileStream や NetworkStream 等バイナリ列の実体をあらわすクラスだけ。
  • そこからテキストに変換するのは、TextReader など全然別のクラス群が行う。

Squeak においても、Stream クラスの対象をバイト列のみに制限する事によって、実装はよりクリーンになるだろう String や ByteArray など、要素のクラスを制限するクラスは他にある事だし、Stream もそうであっても構わないと思う。それか、ByteStream クラスでも作るかな。他のプラットフォームの仕組みも色々調べてから続きを書きます。