«前の日記(2003年07月28日) 最新 次の日記(2003年07月30日)» 編集

Matzにっき


2003年07月29日 [長年日記]

_ [OOP]オブジェクト指向は難しい

昨日、オブジェクト指向の部分でつまづいていますというツッコミをいただきました。 人によって「オブジェクト指向」のつまづき方はそれぞれだと思うので、 誰にでも分かるという説明は実は困難なのですが、最初のきっかけになる解説を試みようと思います。 これより先は書籍なりを参照してください。

Rubyで最小限覚えないといけないオブジェクト指向の基本概念は以下の通りだと思います。

  • 「値」はすべて「オブジェクト」と呼ぶ
  • 「オブジェクト」の「メソッド」を呼べる。「オブジェクト」は「メソッド」が呼ばれると自分に合わせた処理を行う。
  • 「オブジェクト」は「クラス」に所属する。
  • 「オブジェクト」が持つ「メソッド」は(原則的に)その所属する「クラス」で決まる。

ね、そんなに難しくないでしょ。

あと、ドキュメントを読むために「継承」を理解した方が良いかもしれません。

  • 「クラス」は親となるクラスである「スーパークラス」を持つ。
  • ある「クラス」に所属する「オブジェクト」が持つ「メソッド」は、そのクラスで定義されたものと、スーパークラスで定義されたものを(先祖までさかのぼって)合わせたものだ。

それからRubyにはMix-inがありますから、これも押さえておきましょう。

  • 「メソッド」などをまとめる単位として「モジュール」がある
  • 「クラス」は「モジュール」をincludeできる(これをMix-inと呼ぶ)
  • includeされた「モジュール」の「メソッド」は「スーパークラス」同様、「クラス」に受け継がれる

ですから、文字列のクラスであるStringクラスには、長さを求めるsizeメソッドなどが定義されており、 スーパークラスであるObjectクラスから引き継いだobject_idメソッドなども持ちます。

さて、ではオブジェクト指向のメリットはなにか、ということですが、大きく分けると

  • オブジェクトが自分に合わせた処理を選ぶので、プログラマが選択する必要がない。つまり、 自分で値と処理の適切な組み合わせを選ぶ

    str = "abc"
    string_size(str) #=>3
    ary = [1, 2, 3, 4]
    array_size(ary)  #=>4
    string_size(ary) #=> error!!

    という「非オブジェクト指向」と、言語が勝手に選択してくれる

    str = "abc"
    str.size         #=>3
    ary = [1, 2, 3, 4]
    ary.size         #=>4

    という「オブジェクト指向」の嬉しさの違いです。

  • 機能がクラス単位で整理されるので理解しやすい。 つまり、Perlのリファレンスマニュアルのように数百の関数がフラットに並ぶのと比べると、 Rubyのリファレンスマニュアルのように文字列の機能はStringクラスに、 すべてのオブジェクトに共通の機能はObjectクラスに分類されている方が、 整理されていると感じられます。
  • 継承によって機能の拡張が行いやすい(時がある)。 つまり、既存のクラスとほとんど機能が同じだが微妙に違うクラスを作りたい時には、 既存のクラスを継承して、微妙に違う部分だけ追加したり、書き換えたりするだけで、 新しいクラスを作れるというもの。これを「差分プログラミング」と呼ぶ。

「差分プログラミング」はさほど重要ではないのですが、 オブジェクト指向を解説した書籍では必要以上に強調される傾向があります。

まあ、最初の一歩としてはこんなもんでしょうか。


«前の日記(2003年07月28日) 最新 次の日記(2003年07月30日)» 編集