Ruby 分担作業をするとはどういうことなのかまとめてみた。
こんにちは、iPhoneアプリ開発者の中川です。Objective-c、Swift、C++などいろいろな言語をつまみ食いしてるけどいまいちクラスを使う利点がわかってない僕です。はてはて。
最近「Ruby on Rails 4」を使ってRubyの勉強を始めたのですが、Rubyのオブジェクト指向プログラミングの利点である、複数人でクラス作成を分担するということがイマイチわからないので調べてまとめてみました。Web上には多くの情報が存在するので、しっかりとした説明を読むのはゴールが見えなくて辛い、おおまかな概念がわかればいいよ!という方の参考になればと思っています。
①クラスとは。
クラスはオブジェクト(インスタンス)を生み出すために存在します。生み出されるオブジェクトの仕様は、クラスに記述されており、ユーザがオブジェクトにアクセスしてその機能を実現しようとするとき、オブジェクトはクラスからその機能を借り出します。
②クラスは大きく2種類に分類されます。
Rubyに予め多数用意されている組み込みクラス。
自分で作成する独自クラス。→これが本記事のメインテーマ。
例)Creatureクラスという独自クラスの定義。
1 2 3 4 5 |
class Creature def initialize(name) @name = name end end |
③newメソッドを使ってオブジェクト(インスタンス)を生成する。
独自クラスからオブジェクトを生成するには、newメソッドを使います。newメソッドを呼び出すと②の例でいうところのinitialize(name)が呼ばれます。
”Hiroshi”という名の友達オブジェクト(my_friend)を生成してみましょう。
1 2 3 4 5 6 7 8 |
class Creature def initialize(name) @name = name end end # Creatureクラスのnewメソッドでオブジェクトを生成する my_friend = Creature.new('Hiroshi') |
④オブジェクトの特性はそのクラスのメソッド定義でほぼ決まる。
メソッドはdef式を使って定義できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Creature def initialize(name) @name = name end # newで定義されたnameをreturnするnameメソッドを定義。 def name @name end end my_friend = Creature.new('Hiroshi') my_friend.name # => "Hiroshi" |
⑤継承。
あるクラスが定義したメソッドを、あたかも自分に定義されたもののように他のクラスが利用できます。継承を使うことでわざわざ独自のメソッドを作成する手間が省けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Creature def initialize(name) @name = name end def name @name end end class Person < Creature # CreatureクラスのサブクラスPersonを定義 def initialize(name,age) super(name) #Creatureクラスのnameメソッドを呼ぶ @age = age end def age @age end end # オブジェクトを生成してPersonクラスに定義したメソッドを実行 me = Person.new(‘Hiropon’, 23) me.name # => "Hiropon" me.age # => 23 |
⑥実はRubyでは継承関係にない独立したクラスというのは作れない。
クラス定義においてスーパークラスを指定しないとき、Rubyは勝手にObjectクラスをそのスーパークラスにセットします。つまりすべてのクラスはObjectクラスのサブクラスなのです。
1 2 3 4 5 |
class Creature #実は < Object が省略されている。 def initialize(name) @name = name end end |
⑦モジュールオブジェクト。
さて、クラスの作成はメソッドを定義していくことがメインだということがわかりました。
ここでモジュールオブジェクトという概念の登場で更に分担作業の意義がわかってきます。
モジュールは、継承関係に立つことができない独立したクラスです。そこからオブジェクトを生成することもできません。
要するにnew()できないのです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
module Behavior def self.description # モジュールメソッドの定義 "I'm a Behavior Module." end def sleep # インスタンスメソッドの定義 "I'm sleeping." end def eat "I'm eating." end end class PersonInEarth < Person include Behavior # Behaviorモジュールを読み込む def initialize(name,age,country) super(name,age) @country = country end def country @country end end a_friend = PersonInEarth.new('Fernand', 34, "Spain") a_friend.eat # => "I'm eating." a_friend.sleep # => "I'm sleeping." Behavior.description # => "I'm a Behavior Module.” |
注目するところは、moduleという定義式とincludeメソッドです。
クラスにモジュールをincludeすることでモジュールで定義したメソッドをあたかもクラスにあるかのように働くのです。
まとめ。
アプリケーションを作っていく上で分担作業をするというのは、メソッド作成を分担することができることのようです。きっとオブジェクト指向プログラミングの利点はチームのプログラマそれぞれが必要なモジュールを作成していき、それを持ち寄ってクラスに組み込んでいくということなのでしょう。ずっと気になっていたオブジェクト指向プログラミングの利点は何なのかというモヤモヤがスッキリしました。
ディスカッション
コメント一覧
まだ、コメントがありません