プログラミング

【Ruby入門】オブジェクト指向をドラクエ風に図解する

こんにちは、リョウタです。

テックアカデミーの「Webアプリケーションコース」が2週間目にさしかかっています。

思考整理のために、Rubyを習得する上で重要な「オブジェクト指向」についてまとめます。

Progateをやったりコードを書いてみるだけだと、分かりずらい部分もあったので、みんな大好きドラクエに当てはめて図解しました。

この記事を読めば、オブジェクト指向の要点を抑えることができます。

サクッとまとめただけなので、図のクオリティには期待しないでください。

この記事の内容
  1. オブジェクトとは?
  2. クラスとインスタンスの関係
  3. クラスの継承
  4. クラス変数とクラスメソッド

1.オブジェクトとは?

Ruby をはじめ、 Java, PHP, C++, C#, Swift といったプログラミング言語は全てオブジェクト指向プログラミング言語です。

なので、ここをしっかり理解しておくと、Rubyだけでなく、他の言語も習得しやすくなります。

オブジェクトとは、ざっくりいうと、関連する変数(値)メソッド(動作)をまとめて、そのまとまりに名前をつけて分かりやすくしたもの。

Rubyができる前は、変数とメソッドが別々に管理されていたのですが、それだとコードが分かりづらいし、後から編集するときに大変です。

なので、オブジェクトで関連するものを1つにまとめて管理しやすくしています。

Rubyはオブジェクトはクラスベースに基づいています。

ドラクエのスライムに例えてみましょう。

2.クラスとインスタンスの関係

クラスからインスタンスを生成する

スライムを作るにはどうすればよいか?

スライムには、「HP」「Power」という変数(能力)があります。(※他にも能力はありますが、ここでは2つ例を上げときます。)

そして、「攻撃する」「魔法を使う」というメソッド(動作)があります。

この変数とメソッドをまとめて「slime」というクラスでまとめます。クラスはスライムの設計図のイメージです。

ただ、設計図だけだと、スライム本体は存在していません。

そこで、「slime.new」でスライムのインスタンス(実体)を生成します。

このように、クラスからインスタンスを生成することで、ようやくスライムが誕生します。

  • クラス(設計図)の中に変数とメソッドをひとまとめにする。
  • 「slime.new」でインスタンス(実体)を生成する。

インスタンス変数とインスタンスメソッド

実際にコードをみてみましょう。

これをターミナルで実行すると、

スライムが主人公を攻撃して3ポイントのダメージを与えた!

initializeはインスタンスを生成するときに最初に呼び出せるメソッドで、クラス初期化のために使います。

初期値をinitializeメソッドにまとめておくと便利。

例えばスライムのHPは攻撃されれば減るけど、初期値は変わりません。

initializeの引数

スライムが2匹いたらどうなるでしょうか?

実行結果

スライムAが主人公を攻撃して3ポイントのダメージを与えた!
スライムBが魔法使いを攻撃して3ポイントのダメージを与えた!

initialize( )に’A’と’B’の引数を渡すと、スライムAとスライムBが実行されます。

3.クラスの継承

クラスが複数あるときに、重複した部分を省略するために、クラスを継承します。

Characterクラスの中にSlimeクラスとHeroクラスがあります。

スライムにも主人公にも、hpやpowerといった変数は共通して持っています。

また、nameやattack、defeatといったメソッドも共通しています。

実行結果

スライムAが主人公を攻撃して3ポイントのダメージを与えた!
主人公がスライムAを攻撃して30ポイントのダメージを与えた!
主人公はスライムAを倒した!

4.クラス変数とクラスメソッド

先ほどのコードの中で、type’スライム’はインスタンスではなく、Slimeクラスに共通しているといえます。

@@でクラスに変数を持たせることができます。

def self.discriptionでクラスメソッドとなります。

実行結果

スライムAが主人公を攻撃して3ポイントのダメージを与えた!
主人公がスライムAを攻撃して30ポイントのダメージを与えた!
主人公はスライムAを倒した!
主人公は、この世界を守る勇者だ!
スライムは、最弱のモンスターだ!

スライムクラスの中でも変わらぬ事実はクラスメソッドで定義する。

  • 名前が「スライム」であること。
  • 最弱のモンスターであること。

スライムごとに異なる値はインスタンスメソッドで定義する。

  • hp
  • power

 

さいごに

文法を暗記する必要はありません。

イメージを掴んで、自分でアレンジしてコードを書いてみましょう!

次回は「モジュール」についてまとめていきます。