オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな#2-1

当サイトではアフィリエイト広告を利用しています。

C#を勉強する順番

「オブジェクト指向って何なんだろう?」

あなたもプログラマーなら一度はこの疑問を持ったことがあるだろう。

オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな…きっと

オブジェクト指向って何?

オブジェクト指向とは何でしょうか?
私が13年ほど前に読んだ「なぜオブジェクト指向で作るのか?」という本にはこう書いてあった。なぜオブジェクト指向で作るのか?の問いに対して,それは「簡単にプログラムを作りたいから」

当時の私はダメダメ文法プログラマーだったため,この言葉の意味はまったく理解できませんでした。しかし今なら分かります。

私も今ならこう答えます。なぜオブジェクト指向で作るのか?それは

  • 「バグの無いプログラムを作りたいから」
  • 「保守性の高いプログラムを作りたいから」
  • 「複雑でないプログラムを作りたいから」

全部同じような意味ですが,前述の「簡単に作りたいから」というのは「再利用」が簡単にできて,修正もしやすいプログラムを作るには,「オブジェクト指向」で作る以外に無い。ということだと思います。

オブジェクト指向でプログラミングをすると,今言っているようなことが実現できます。

しかし,最初の問いにまだ答えられていませんね。
「オブジェクト指向」とは何か?

「人の数だけオブジェクト指向がある」といってしまえばそうなのですが,こんな答えだとなんの解決にもならないのでもう少し具体的に考えましょう。

オブジェクト指向を教えている技術書を紐解けば,オブジェクト指向の原則というものを書かれています。ここではあえて書きませんが,おそらく5つの原則があり,それにそってかかれたものが「オブジェクト指向」であると定義することができます。

一言で言えないところがなんともプログラマー全員の頭を悩ませる原因だと思います。

というわけで,オブジェクト指向が何かを学びたければ,その原則を学べばよいということになります。ちなみに原則とはできるだけそれに従うというイメージのもので,絶対的に破ってはいけないものではありません。

原則を理解しながらも,それ以上に破る有益な理由がある場合は,躊躇せず破りましょう。一番いけないのは,その原則を知らずに破ること。より良い実装がこの世に存在することが知らないことが罪なわけです。

もしあなたが「マイホーム」を建てるなら,知識の豊富な建築家に設計してもらいたいですよね?立地条件や予算,環境,耐震性などをすべて考慮し,海外の設計手法や,日本の昔の設計手法も全部知り尽くしている人が,状況におおじて,ベストな選択をしてくれた家を作ってほしいですよね?

コンクリート打ちっぱなしの家を作ったことしかないので,あなたの家もそれで良いですか?なんていわれたら即刻クビにしますよね?

しかし恐ろしいことに,プログラマーの世界では,それが往々にしてまかり通っています。
「C#の文法しか知らない」のにプログラミングをするというのは,まさにそういう状態です。

if文やfor文は建造物で言うところの釘の打ち方です。それしか知らずに,耐震性の高い家など建てれませんよね?そういうことを知りたければ,設計を学ばないといけません。プログラマーもプログラム設計を学ばないといけません。

その入り口がオブジェクト指向です。これが最強にしてすべてです。

ではどうやってそれを学べばよいのでしょうか?

それは、、、デザインパターンを学ぶことです。

デザインパターン

オブジェクト指向が何たるかを知りたければ,デザインパターンを学びましょう。有名なGOFのデザインパターン本が理解できれば良いですが,あの本は天才4人の本で,私のような凡人には,なかなか理解できませんでした。「メソッドをカプセル化する」という表現がたびたび出てきますが,それを「ストラテジーパターンのようにインタフェースの向こう側に関数を置くことなんだな」と理解できたころ,彼らが何を言っているのかが,スーッと入ってきたのを覚えています。

「メソッドをカプセル化する」がどういう意味かの解説はどこにもないので,彼らの会話のレベルの高さについていけるようになるには,別のデザインパターン本を3冊程度読んでからでないと理解ができないでしょう。

前回も紹介しましたが,HeadFirstシリーズのデザインパターンは漫画みたいな感じでなかなか読みやすいです。あと「オブジェクト指向のこころ」という本も分かりやすかったです。

「オブジェクト指向のこころ」ではデザインパターンを教えながら,オブジェクト指向の原則も教えてくれます。プログラムの骨格部分と,振る舞いの部分と,生成する部分に分けるなど,パワフルな考え方を教えてくれます。

デザインパターンと同じようなジャンルで,リファクタリングというものもありますが,あれは,現状のプログラムの動作を変えないように,よりよい実装に変化させるというものなので,デザインパターンよりは,もう少し小さいスケールだったり,局所的な使い方が多いです。

リファクタリングに関してはまた別の機会に紹介します。