selflearn @ ウィキ

SICP(2.4 抽象データの多重表現)

最終更新:

kato

- view
メンバー限定 登録/ログイン

『2.4 抽象データの多重表現』

この節から読み方、進め方を変えることにした。これまではテキストと解く問題の進み具合を完全に同期させていたけれど、ここからは先の節・章も同じトピックが続く限り読んでしまい、概要を掴んでから各質問に取り組むことに変えた。
理由は、これまでの方法だと抽象的に内容を見ることができず、理解の範囲が限定されてしまうから。最初の頃は簡単な事柄が多かったのでそれでも良かったけれど、このあたりになってくると複数小節で1つの概念を考えようとしていたりするため。考えがまとまっていないまま読んでしまい、全然勉強になっていなかった。

最初の頃は「自分はこの本を続けられるんだろうか、途中で飽きたりしないだろうか」という不安もあって、少しでも良いから足がかりを作っていきたかった。でも、ある程度自分でも続けられる(どうあれ、1年も続けてる)ことが分かったので、効率の良い方法に変更しようと。

まとめ

データ構造を表現(出力)する手段を複数持たせましょう、という話。これまでデータ抽象による複雑の制御を行ってきたけれど、そもそもこれだけでは幾つか問題を抱えていて、

  • データ表現に対する要求は変化するかもしれない
  • 同じデータに対するいくつかの要求が混在するかもしれない

という点が解決できていない。本節ではその問題に対して、まずは後付けのデータ表現を追加することで解決をはかろうとしている。データに対する汎用的な手続きや、さらには小さなFacadeのような複数のデータ表現に対する統一的な手続きのパッケージを作成して、データ表現の多様性を用意し、それを一元的に扱える仕組みを用意している。

オブジェクト指向のメッセージパッシングの理屈、データが自立的に動く概念もここで出てくる。

各小節の内容

2.4.1 複素数の表現

複素数zを表現し、その算術演算を実行するシステムをここから作り始める。ただし「単純かつ非現実例」として。ここから、
  • 直交座標形式rectangler(実部と虚部)
  • 極座標形式polar(絶対値と偏角)
この2つの表現を型タグ(?まだ分からない)と汎用演算の使用(これもまだ分からない)によって共存させるかを記していくことになる、らしい。

複素数の表現形式は二人のプログラマ:Ben Bitdiddle, Alyssa P. Hackerで異なっている。Bitdiddleは
(実部 虚部)
という直交座標によるリスト表現。一方Alyssaは
(絶対値r 偏角A)
と極座標表現している。+と-は座標形式の方が簡単だし、*と/は極座標形式のほうが簡単。二人の表現は最初衝突していて相容れないけれど、それを適切なデータ抽象により統一していくことが、ここ一連の節の面白いところ、みたい(まだ自信無し)。
適切なラッパーを提供することで汎用的にしていくのかな?

2.4.2 タグ付きデータ

なるほど、「型タグ」とは、値に「自分がどういうデータ型か」という情報を持たせることだったんだ。これは今のオブジェクト指向の考え方だ。変数が型を持つのではなく、値が型を持つんだ。

2.4.3 データ主導プログラミングと加法性

2.4の最初から始まっているデータを中心に物事を考える、というスタンスはこの節で結実する。
いやいや、びっくりするような展開。これまではデータの新しい表現に対して、ロジックの追加を複数箇所に行っていた。プログラムを保守しているとありがちな状態だね。けれど、これだとプログラムの規模が大きくなった時にメンテナンス性が指数関数的に大変になってきてしまう。

真に「加法的である」というのは、データに対するロジックを既存アルゴリズムに対して直交的に追加するだけで済むということ。複数箇所を「変更」する必要は無く、ただ「追加」するだけ。

そこでこの節では、データベース(テーブル)を用意しておき、データが持っている型タグをキーにした演算一式を追加する、という方針を採っている。

普通にあるデータベースのイメージだと、追加するのはデータだけというイメージがあるけれど、そうではなく演算を保存するという考え方が新鮮だった。

仕事で書いたプログラムでも同じような考えを導入したくらい、ここは参考になった。

タグ:

SICP scheme
記事メニュー
目安箱バナー