【8月4週目】「プロを目指す人のためのRuby入門」を読んで(2/2)
はじめに
前回のブログの続きです。
前回は配列と繰り返しの処理についてを取り上げましたが、今回はクラスの作成について書いていこうと思います。
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という機能があり、私は今までそれをコントローラで実行して事前にインスタンス変数が使えるようにしていたので、 違いが曖昧でしたが、処理が実行される前とオブジェクトが作成されるタイミングの違いやRubyとRailsの違いなどがわかりました。 特に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メソッドを再定義しなければ そのまま親クラスのメソッド内の処理が実行されます。
おわりに
この本の中では「配列とクラス」について取り上げましたが、それ以外にもモジュールであったり例外処理といった項目があって、かなりボリューミーな内容の一冊となっておりました。 なんとか一通り読み終えることができましたが、実装で困った時などにもう一度読み返すと思います。
初学者の頃は「こういう概念があるのか〜」くらいに思っていても、個人で作るアプリケーションは小規模で、使うタイミングがなかったものが多かった(継承は特に)のですが、実務を行うにあたって徐々にこういった概念を理解する必要があると感じていたので、今の自分にはぴったりの一冊だと感じました。
また、今回クラスの継承を扱った際に、オブジェクト指向プログラミングの理解が足りていないと感じたので次回はオブジェクト指向に関する書籍を読んでみようと思います。