最近「オブジェクト指向とは何ぞや」を書くのが流行ってるらしいので、自分なりの理解を書いてみる。一言でまとめると、
オブジェクト指向でコードを書くときは、「神」になるべきである。
オブジェクト指向言語=創世記
まずは、何も言わずに次のドキュメントを見てほしい。
1 はじめに神は天と地とを創造された。
2 地は形なく、むなしく、やみが淵のおもてにあり、神の霊が水のおもてをおおっていた。
(中略)
11 神はまた言われた、「地は青草と、種をもつ草と、種類にしたがって種のある実を結ぶ果樹とを地の上にはえさせよ」。そのようになった。
出典:wikisource
これはある「神」というプログラマが「世界」というプロジェクトを実装したときのドキュメントで、「創世記」という名前で知られている。
これこそ「オブジェクト指向」の典型だと思う。なぜなら、このドキュメントからコードを書き起こすことができるからだ。
創世記を実装してみる(?)
とはいえ、このままだと「は?意味わかんないんだけど」「飛ばし記事乙」「ゴミ記事を増やしてんじゃねえ」となるので、もう少し解説する。
ヘッダ
ここでのポイントは「xxとはこういうものだ」という表現にある。そのxxがクラスと呼ばれる。
たとえば、項番1,2を実装するとしたら次のようになる。まず、出てくるもの、つまり実装すべきクラスを整理する。ここでは天(heaven)と地(earth)を実装すると書いてある。つまり、C++で言うとヘッダでクラスを定義することにあたる。
委譲
「地は(中略)やみが淵のおもてにあり」ということから、地はやみ(dark)というメンバ関数を持っていることがわかる。このようにクラスが他のクラスのメンバを持つことを集約(コンポジション)とか、特にそのメンバの機能を用いて元のクラスの実装を簡単にしているような場合は委譲1 と言ったりする。
以上をまとめると、例えば地の実装は次のようになる。
class earth{
dark m_dark;
};
メンバ関数、メソッドの実装
「地」の実装では、変数だけがまとめられている。これは別にオブジェクト指向でない言語での構造体でも実装できる。
11番を実装しよう。
神はまた言われた、「地は青草と、種をもつ草と、種類にしたがって種のある実を結ぶ果樹とを地の上にはえさせよ」。そのようになった。
ここで果樹を実装することを考えると、「実を結ぶ」という機能が果樹に備わっている、ということがわかる。これを実装すると、
class fruitTree{
fruit m_fruit;
void bearFruit(void);
}
となる。
「もの」を宣言していく作業こそ「オブジェクト指向」
オブジェクト指向とは何ぞやという話に戻ろう。
オブジェクト指向では、
- こういう「もの」があって
- それはこういう変数を持っていて
- こういう機能がある
ということを設計していく。つまり、プログラムの中の世界を作り上げていくということである。これが「神になれ」という所以である。すべてのプログラマは自身のコードの中では造物主である。
じゃあどうやって神になるか
- 根本的に、抽象化力を磨く。
- 鍛錬を積む。何度も世界を作って壊す。
- うまい神の世界を見てみる。うまい神と一緒に世界を作ってみる。
- デザインパターンを勉強してみる。
参考文献
- Getter/Setterは悪だ。以上。
https://www.kaitoy.xyz/2015/07/22/getters-setters-evil/
-
C#では委譲というと単にメンバを持つということではなく、また別の機能を指すので注意(本質的には同じなのかもしれないが)。 ↩