第11章 オブジェクト指向プログラミング C言語によるオブジェクト指向プログラミング
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
私たちは複雑な考えをシンプルに表現することを好む。
...
我々はフラットなフォームのためにある
幻想を破壊し、真実を明らかにするからだ。
ル・ティグレ『自由大学でのスライドショー
C言語でも他の言語でも、典型的なライブラリの一般的な形式を以下に示す:
-
ライブラリが扱う分野の主要な側面を表す小さなデータ構造のセット。
-
これらのデータ構造を操作する一連の関数(しばしばインタフェース関数と呼ばれる)。
たとえばXMLライブラリーは、XMLドキュメントを表す構造体と、おそらくそのドキュメントのビューを持ち、さらにデータ構造とディスク上のXMLファイルとの間を行き来したり、構造体に要素をクエリしたりするための関数をたくさん持っている。データベース・ライブラリには、データベースとの通信状態を表す構造体と、テーブルを表すデータ構造、それにデータベースと通信したり、データベースから送られてくるデータを解析したりするための関数がある。
これはプログラミングやライブラリを構成する上で、極めて賢明な方法である。それは、作者が目下の問題に適した名詞と動詞で概念を表すことができる手段である。
オブジェクト指向プログラミング(OOP)の正確な定義を説明することで時間を浪費する(そして炎上する)のは避けたいが、オブジェクト指向ライブラリの説明を読めば、私たちが何を目指しているかがわかるだろう。
ある機能がOOPに不可欠だと主張する専門家に対し、その機能をOOPの核心から逸脱したものと見なす専門家も発見されるだろう。1とはいえ、ここでは基本的な構造体+関数オブジェクトを拡張した、ごく一般的なものをいくつか紹介しよう:
-
継承とは、構造体を拡張して新しい要素を追加することである。
-
仮想関数。クラス内のどのオブジェクトに対してもデフォルトの振る舞いを持つが、オブジェクト(または継承ツリー上のその子孫)の異なるインスタンスに対して特定の振る舞いを持つことができる。
-
構造体の要素をプライベートとパブリックに分けるなど、スコープを細かく制御する。
-
演算子のオーバーロード。同じ演算子でも、演算する型によって意味が変わる。
-
参照カウント。関連するリソースがすべて使用されなくなった場合にのみ、オブジェクトを解放することができる。
参照カウントは基本的にカウンタを維持する必要があり、関数(演算子ではない)のオーバーロードはこの目的のために設計された_Generic キーワードを使用し、仮想関数はオプションで代替関数の key/value テーブルにバックアップされたディスパッチ関数を介して実装することができる。
基本的なstruct-plus-functionsオブジェクトに対するこれらの拡張が非常に簡単で、数行のコードで済むのであれば、なぜC言語で書いている作者たちはいつもそれを使わないのだろうか?
言語と認知を結びつけるサピア=ウォーフ仮説は、さまざまな形で述べられている。he、she、his、herのような性別を示す記号を避けて人についての文章を作るのは、しばしば厄介だからだ。C言語では、他の言語以上にメモリ割り当てについて考える必要がある(そのため、C言語以外のユーザからは、C言語のコードはメモリをひたすらいじくり回すだけのものだという固定観念が生まれるかもしれない)。広範なスコープ演算子を実装している言語では、変数がいつ、どのオブジェクトに見えるのかを正確に考えなければならない。たとえその言語が技術的には、オブジェクトのメンバをすべてpublicと宣言してコードをコンパイルすることを許可していたとしても、誰かがあなたを怠け者呼ばわりし、きめ細かなスコープについて考えなければならない言語周辺の規範を思い出させるだろう。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access