Ryo5smileの技術ブログ

学んだこと

【8月4週目】「プロを目指す人のためのRuby入門」を読んで(2/2)

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)

はじめに

前回のブログの続きです。

前回は配列と繰り返しの処理についてを取り上げましたが、今回はクラスの作成について書いていこうと思います。

Rubyといえばオブジェクト指向型の言語であり、クラスはオブジェクト指向においてとても重要な概念です。しかし、自分の中での理解が結構ふわっとしていたので より具体的に理解を深めようと思いました。ちなみにクラスの説明はここでは省きます。

クラスの定義

クラスを作成するための構文は以下の通りです。

# Postクラスの定義
class Post

end

ちなみにクラス名の最初の文字は必ず大文字で始まります。小文字で変えてしまうとエラーが起きてしまいます。 PostItemのように単語が2つ以上ある場合はキャメルケースで書くことが慣例とされています。

オブジェクトの作成とinitializメソッド

オブジェクトの作成はnewメソッドを使います。

Post.new

そして、このオブジェクトが作成されたタイミングでインスタンスを初期化するために実行したい処理があれば initializeメソッドを使います。

class Post 
  def initialize
     @name = "名前"
  end
end

Post.new
# この時に@nameに文字列"名前"が代入される

自分自身initializeメソッドはほとんど使ったことがなかったのですが、引数を渡してその引数をインスタンス変数に代入する処理が書かれているイメージでした。 RubyフレームワークであるRailsではbefore_actionという機能があり、私は今までそれをコントローラで実行して事前にインスタンス変数が使えるようにしていたので、 違いが曖昧でしたが、処理が実行される前とオブジェクトが作成されるタイミングの違いやRubyRailsの違いなどがわかりました。 特にRubyの機能なのかRailsの機能なのかが混合していていたので、その辺もこの本を読むことでしっかり理解できると思いました。

クラスの継承

オブジェクト指向のプログラミングといったら「継承」が肝になってきます。継承抜きではオブジェクト指向は語れないというほど、根幹にある概念です。 クラスの継承を行うことによって、たくさん書くコードをスッキリさせるなどのメリットがあります。

クラスの継承方法

クラスの継承を行うにはを使用します。今回はPenguinクラスにBirdクラスを継承させます。

class Bird
   def wing
      "羽ばたく"
   end
end

class Penguin < Bird
end

penguin = Penguin.new
puts penguin.wing

このようにBirdクラスで定義したwingメソッドが継承されたPenguinクラスでも使うことができます。 ちなみにRubyは単一継承といって、継承できるクラスは1つのみとなっているので注意が必要です。(ただしMixinという複数のクラスに継承できる機能があるようです)

親クラスのメソッドを呼び出す

継承元の親クラスのメソッドを継承先の子クラスで呼び出すにはsuperを使います。 Penguinクラスに継承されたBirdクラスのメソッドを呼び出すと以下のようになります。

class Bird
   def wing
      puts "羽ばたく"
   end
end

class Penguin < Bird
  def wing
    super
    puts "広げる"
  end
end

penguin = Penguin.new
penguin.wing
#=>
#"羽ばたく"
#"広げる"

これは特に子クラスで固有の処理を追加したいときに、わざわざ親クラスと同じ記述をしなくても良くなるので便利だと感じました。

メソッドのオーバーライド

オーバーライドとは、親クラスで定義しているメソッドと同じ名前のメソッドを子クラスで再定義(上書き)することです。 継承して同じ特徴を引き継いだとしても、「このメソッドは異なる処理にしたい!」なんていう場合などに使えそうです。

class Bird
   def wing
      puts "羽ばたく"
   end
end

class Penguin < Bird
  def wing
    puts "広げる"
  end
end

penguin = Penguin.new
penguin.wing
#=>
#"広げる"

パッと見て先ほどのコードと見分けがつきにくいですが、puts "羽ばたく" から"広げる"に上書きされているのがわかります。 なお、Penguinクラスでwingメソッドを再定義しなければ そのまま親クラスのメソッド内の処理が実行されます。

おわりに

この本の中では「配列とクラス」について取り上げましたが、それ以外にもモジュールであったり例外処理といった項目があって、かなりボリューミーな内容の一冊となっておりました。 なんとか一通り読み終えることができましたが、実装で困った時などにもう一度読み返すと思います。

初学者の頃は「こういう概念があるのか〜」くらいに思っていても、個人で作るアプリケーションは小規模で、使うタイミングがなかったものが多かった(継承は特に)のですが、実務を行うにあたって徐々にこういった概念を理解する必要があると感じていたので、今の自分にはぴったりの一冊だと感じました。

また、今回クラスの継承を扱った際に、オブジェクト指向プログラミングの理解が足りていないと感じたので次回はオブジェクト指向に関する書籍を読んでみようと思います。