Ruby メソッドとクラス

### 話すこと
１：メソッド
２：クラス
３：インスタンスメソッド
４：クラスメソッド
です。

### １：メソッドとは
メソッドとは、複数の処理をまとめてくれるもの。

``` greet.rb
def greet(name)
  puts "#{name}, HELLO!"
end
greet('Alice')
> "Alice, HELLO"
```
の **greet(name)** がメソッドにあたる。メソッドは定義されている部分(def ~ end)では読み込まれず、実行されること(greet('Alice'))によって初めて読み込まれる。

メソッドは、
１：値を渡せる
２：最後に評価値が返る
３：メソッド内で定義した変数は、外部アクセスできない
という特徴を持っている。

メソッド名が長い場合、スネークケースで書くことが慣習なので、
> greetHerではなく **greet_her**
sendMailではなく **send_mail**

という形で書く必要がある。

#### メソッドを使うメリット
１：メソッドで定義された処理は再利用が出来る
２：コードの修正が容易になる

例えばこんな感じのコードがあるとする。

```number.rb
puts 1
puts 2
puts 3
puts 4

puts 1
puts 2
puts 3
puts 4

```
いちいち、puts 1と書くのはとても面倒なため、メソッドを使って書き換えてみる

```number.rb
def number
  puts 1
  puts 2
  puts 3
  puts 4
end

number # 1回の実行で1,2,3,4一気に出力してくれる
> 1
> 2
> 3
> 4
```
また、もし puts 3が必要じゃなくなった時、メソッド内のputs 3を削除するだけで良い。

```number.rb
def number
  puts 1
  puts 2
  # 削除
  puts 4
end

number # 1回の実行で1,2,4一気に出力してくれる
> 1
> 2
> 4
```

このように再利用化されやすいよう、メソッドを作ることで、全体の修正も安易になっていくものとなる。

### ２：クラスとは
インスタンスを生成する際に使用する元となるもの。クッキーを作るときの型のようなものだと思えば想像しやすいかも。

``` cookie.rb
Class Cookie #クラス名=Cookie
  def cookie #メソッド名=cookie
  end
end
#実際にCookieクラスという型からインスタンスを生成 ↓
cookie = Cookie.new
cookie
#出来た ↓
=> #<Cookie:0x00007ff34c847fa0>
```
\<Cookie:0x00007ff34c847fa0>
が、Cookieクラスによって作られたインスタンスである。クラス名.newとすることで、インスタンスは生成可能となる。インスタンスとは、元となるものから作られた実体そのものを指す。簡単に言えば、型から作られた実際のクッキー。


#### 情報を持ったインスタンスを作る
initializeメソッドを使うことで、インスタンスを生成するときに情報を持たせることができる。今回はCookieインスタンスに size、taste と二つの情報を持たせてみる。

```cookie.rb
class Cookie
  def initialize(size, taste)
    @size = size
    @taste = taste
  end
end

cookie = Cookie.new('Large', 'Sweet')
cookie
=> #<Cookie:0x00007ff34d2a7108 @size="Large", @taste="Sweet">
```
これにより、大きいサイズで、甘い味の、クッキーインスタンスを生成することができた。急に出てきた、
> @size
@taste

@から始まるコイツらは**インスタンス変数**と呼ばれるもので、インスタンスごと（クッキーごと）に保持しているデータを変更することができる。今回、sizeは第一引数、tasteは第二引数で、それぞれ'Large', 'Sweet'と対応している。
これを応用することで、

``` cookie.rb
cookie1 = Cookie.new('Medium', 'Bitter')
cookie1
=> #<Cookie:0x00007ff34d2cdd30 @size="Medium", @taste="Bitter">

cookie2 = Cookie.new('Small', 'Salty')
cookie2
=> #<Cookie:0x00007ff34d2cdd30 @size="Small", @taste="Salty">
```
と、複数のサイズと味を持った、クッキーインスタンスを生成することができる。

### ３：インスタンスメソッドとは
作成したインスタンス（クッキー）を用いて、実行できるメソッドのこと。
現時点で、クッキーの種類はSmall Saltyと、Medium Bitterと、Large Sweetの3つがあるとする。これらはCookieクラスから作られただけで、**使用されていない。**
インスタンスメソッドは、コイツらを使用して何かすることを目的としている。

``` cookie.rb
cookie2
=> #<Cookie:0x00007ff34d2cdd30 @size="Small", @taste="Salty">

def cookie_taste
  puts "#{@taste}"
end
=> :cookie_taste

cookie.cookie_taste
> Salty
```
cookieが持つ、@tasteインスタンスメソッドのデータが、cookie_tasteの@tasteにデータを渡すことに成功している。このように、インスタンスのデータを元にインスタンスメソッドはデータの参照だったりをすることが出来る。

### ４：クラスメソッドとは
先ほどまではインスタンス経由であったが、クラス経由で同じことが出来る。インスタンスのデータを参照する必要がない時に使う。

``` cookie.rb
class Cookie
  # @@が2つ付くものはクラス変数と呼ばれ、全てのインスタンスで共有することが出来る
  @@my_cookie_is = 0

  def initialize(size, taste)
    @size = size
    @taste = taste

    @@my_cookie_is += 1
  end

  #インスタンスメソッド
  def show_info
    puts "#{@taste}クッキーは#{@size}サイズしかない。"
  end

  # クラスメソッド
   def self.show_all_cookie
     puts "俺は#{@@my_cookie_is}枚分のクッキー食うからな。"
   end
end
```
これを実行した上で

``` cookie.rb
# クラスメソッドの実行
cookie4 = Cookie.new('Medium','Bitter')
cookie4
=> #<Cookie:0x00007ff34d1ae440 @size="Medium", @taste="Bitter">
Cookie.show_all_cookie
俺は1枚分のクッキー食うからな。
# クラスメソッドの実行
cookie5 = Cookie.new('Large','Salty')
cookie5
=> #<Cookie:0x00007ff34c851c30 @size="Large", @taste="Salty">
Cookie.show_all_cookie
俺は2枚分のクッキー食うからな。

# インスタンスメソッドの実行
cookie4.show_info
BitterクッキーはMediumサイズしかない。
# インスタンスメソッドの実行
cookie5.show_info
SaltyクッキーはLargeサイズしかない。
```
となる。

### 参考
【Ruby】たい焼きで理解するオブジェクト指向におけるクラスの概念
https://pikawaka.com/ruby/class#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
とても参考にさせていただきました。ほぼこの記事の簡潔版として書かせていただきました。記事にすることで、浅い知識だったところをカバーできました。