抽象化 (計算機科学)
何を抽象化して、何をコードを書く者の制御下に置くかの判断は、オブジェクト指向設計とドメイン分析の主要テーマである。実世界での適切な関係を見極めることは、オブジェクト指向分析のテーマでもある。
一般に、適切な抽象化を決定するには、範囲/ドメイン分析/連携すべきシステムの決定/様々な制約の分析など、様々な判断を必要とする。そして、オブジェクト指向分析をプロジェクトの外的条件(時間と費用)を考慮して行う。上の単純な例では、ドメインとは庭であり、豚や牛やそれらの食習慣は制約である。詳細な解析により、コード作成者は利用可能なものなら何でも餌として与える柔軟性を持つ必要があると判断する。そのため、クラス自体に餌の型をコード化する必要がないと判断され、結果として豚であっても雌牛であっても同じ Animal クラスとなる。DairyAnimal を別のクラスとする判断を下した場合には詳細は変化するが、ドメインや制約は変わらない。従って全てはプログラマの制御下にある。オブジェクト指向プログラミングでの抽象化と、ドメインや制約の抽象化は区別されている。
次の抽象化レベルではデータベースに格納されているデータが「何」であるかを記述し、それらのデータ間にどのような関係があるかを記述する。従って、論理レベルでは物理レベルよりも単純化された構造でデータベース全体が記述される。論理レベルの単純な構造の実装には物理レベルの複雑な構造が必要となるが、論理レベルのユーザーにはそのような複雑さは無関係である。データベース管理者はデータベースに格納すべき情報を選別する責任があり、論理レベルの抽象化を利用する。
データ抽象化とは、データ型の「抽象的」属性と「具体的」実装詳細の明確な分離を強制することである。抽象化された属性はデータ型(あるいはそのインタフェース)を利用するクライアントコードとして明確化され、具体的実装は完全にプライベートな状態でかつ必要に応じて変更できる形で存在する。概念的には、そのような変更は抽象的振る舞いには変化をもたらさないので、クライアントコードには全く影響を与えない。
例えば、「参照テーブル」という抽象データ型を定義したとする。参照テーブルには「キー」とユニークに対応する「値」があり、キーを指定することで値を操作できる。このような参照テーブルの実装方法はハッシュテーブルや2分探索木や線形リストなどいくつかある。クライアントコードからすれば、データ型の抽象化された属性はどの場合でも同じである。
もちろん、以上の話は最初にインタフェースを正しく詳細化することにかかっており、そうでないと実装の変更がクライアントコードに影響を及ぼしてしまう。別の見方をすれば、インタフェースをデータ型とクライアントコードの間で合意された振る舞いの「契約」を形成すると考えることもできる。契約にない部分は予告なく変更される可能性がある、というわけである。
データ抽象化を実装した言語としてはAdaやModula-2がある。オブジェクト指向プログラミング言語も一般にデータ抽象化を提供すると言われているが、継承の概念によって実装側の情報がインタフェース側に持ち出される傾向がある。したがって、継承関係の変更はクライアントコードに影響を与えることがあり、脆弱な基底クラス問題につながる。
最も低レベルの抽象化であり、データが実際にどのように格納されるかを記述する。物理レベルでは低レベルで複雑なデータ構造の詳細が記述される。