オブジェクト指向まとめ

# 前置き
今更ながらオブジェクト指向の概要をまとめていく。私もオブジェクト指向を理解するのに苦しんだのでなるべく初学者にわかりやすく簡潔に書いていきます。
マサカリ上等ですのでコメントお待ちしております。

# 1.オブジェクト
オブジェクトとは「対象」「物」という意味で、プログラミングではデータ処理の集まりのことを指している。
Rubyでいうならば、配列やHash、数字や文字列など全てのデータは（モノ）オブジェクトである


#2.オブジェクト指向
オブジェクト指向プログラミングとは、モノ（オブジェクト）の作成と操作として見る考え。

#3.クラス（class）
クラス（class）はオブジェクト指向において、データと処理をひとまとめにした設計図のようなもの。
基本的にクラスを元にしてオブジェクトを生成することで使えるようになる

#4.プロパティ（property）
オブジェクトが持っているデータのことをプロパティ（属性）という。

#5.メソッド（method）
オブジェクトが持っている処理のこと。人でいえば「走る、歩く、止まる」などのオブジェクトが何らかのアクションを起こす処理の事

```rb
def メソッドの名前
  やりたい処理
end
```
例えば「こんにちは」と呼びだすhelloメソッドを定義するのであれば

```rb
def hello
  puts 'こんにちは'
end

hello #=> こんにちは
```
　といった感じになる。

#6.インスタンス（instance）
インスタンスとはクラスから生成されたオブジェクトの事。
インスタンス作成の際にはnewメソッドを使用します。

```rb
class human
  def initialize(name)
    @name = name
  end

  def hello
   puts "こんにちは"
  end
end

human = human.new("徳川家康")
```
ここで定義されているinitializeメソッドはインスタンスが生成された時に自動で実行されるメソッドです。
これでnameという属性に「徳川家康」という値がセットされました。

humanクラスから生成されたhumanというインスタンスは徳川家康という固有の名前をもち、helloというメソッドを使うことができます。
この1行だけでこれだけの情報を持ったオブジェクトが作成できるのできます。

#7.カプセル化
オブジェクトが持つデータや処理のうち、別のオブジェクトから直接利用される必要のないものを隠すことを言い、利用する場合は外部から操作するために作られた処理を設けることを言う。先ほどのレーシングカーの例でも出てきた、オブジェクト指向の基本概念。

カプセル化にはpublicとprivateがあります。
publicに記述したメソッドなどは外部からのアクセスは可能だが、privateを指定すると、呼び出す際にエラーとなります。

### publicの場合

```rb
class human
  #public => 何も指定しなければrubyはデフォルトでpublicになる。基本的に省略可能。
  def initialize(name)
    @name = name
  end

  def hello
   puts "こんにちは"
  end
end

human = human.new("徳川家康")
puts human.name #=> 徳川家康が出力される
```
### privateの場合

```rb
class human
  private
  def initialize(name)
    @name = name
  end

  def hello
   puts "こんにちは"
  end
end

human = human.new("徳川家康")
puts human.name #=> エラーが出力される
```

#8.継承
特定のオブジェクトの機能を引き継いで使う事。
似たようなオブジェクトを複数作る時に、全てのプロパティやメソッドをいちいちプログラミングするのは非常に手間が掛かるが、継承を使うことにより、同じ機能を実装できる。

```rb
class Human
  def work
    puts '歩きました'
  end
end

#Humanクラスを継承
class IeyasuTokugawa < Human
  def unification
    puts "天下統一しました"
  end
end

IeyasuTokugawa = IeyasuTokugawa.new
puts IeyasuTokugawa.unification #=> 天下統一しました
puts IeyasuTokugawa.work #=>歩きました

```
クラスを継承した場合、クラス自体で定義されたメソッドの他に親クラスで定義されているメソッドも使用することが出来ます。先ほどの例で言えば「IeyasuTokugawa」クラスのオブジェクトは「unification」メソッドの他に親クラスの「work」メソッドも実行することが出来ます。

クラス内で定義されたメソッドだけではなく、スーパークラス（親クラス）で定義されているメソッドも実行できることが確認できます。

# 9.ポリモーフィズム
ポリモーフィズムとは(Polymorphism)とは、オブジェクト指向プログラミングにおける概念、手法の一つです。日本語で「多様性」とも言います。
異なるクラスに対し、同一のインターフェースが提供されていることを言います。

クラスを使う側は、クラスの実態を意識せずにメソッドを呼び出せます。

```rb
class Human

  def speak(voice='')
    "#{self.name}: #{voice}"
  end
end

#継承
class NobunagaOda < Human
  def speak(voice='鳴かぬなら 殺してしまえ ホトトギス')
    super
  end
end

class IeyasuTokugawa < Human
  def speak(voice='水よく船を浮かべ 水よく船を覆す')
    super
  end
end

NobunagaOda = NobunagaOda.new
NobunagaOda.name = '織田信長'

IeyasuTokugawa = IeyasuTokugawa.new
IeyasuTokugawa.name = '徳川家康'

NobunagaOda.speak    #=>織田信長: 鳴かぬなら 殺してしまえ ホトトギス
IeyasuTokugawa.speak     #=>徳川家康: 水よく船を浮かべ 水よく船を覆す

```
同じspeakメソッドであっても、クラスでの定義に応じて挙動の変化することがわかりました。

#10.オブジェクト指向のメリット・デメリット
###メリット
####1.プロブラムのメンテナンスがしやすくなる
　・プログラムの一つ一つを小さなまとまりで考える事が出来る為、複雑なプログラムが減ります。改修による影響度が減り、メンテナンスがしやすくなります。

####2.分業化ができる
　・システムの規模が大きくなるほど、プログラムの実装は膨大になります。オブジェクト指向は平行で大人数での実装が可能の為生産性が上がります。また似た機能等を他に影響を与える事なく機能を実装することも可能です。

####3.プログラムの品質が高くなる
　・あらゆるところが部品化されている為に問題箇所の特定が容易です。まとまりのあるプログラムのためコードの可読性も高く直感的にわかりやすい。

###デメリット
####1.難易度が高く教育コストがかかる
　・開発現場で活躍する為には付け焼き刃の知識では役に立たない。抽象的な概念が多く、しっかり理解する為にはそれなりに
　　現場経験が必要

####2.設計力が試される
　・継承やポリモーフィズムなど便利な概念が使用できる代わりに、他のコードとの影響性や拡張性、共通化などより可読性高く品質を上げる為には設計力が必要不可欠。

# 最後に
私もまだまだ初学者のため技術力がありません。プログラムを書いている際に基本的概念は少なくとも頭に入れておくことが重要だと思います。他の初学者の皆さんも一緒に覚えていって欲しいと思います。