オブジェクト指向のメリット

(殴り書き、書き途中、たぶん、違うと思う...。)
可読性が上がること
 

理由は、メソッドを呼び出すクライアント側のプログラムが、コードが短くなるから。オブジェクト指向においては、プログラマがプログラミングをする際に、1度に頭の中で意識するべき範囲を狭めることに役立ち、可読性があがると言える。

オブジェクト指向言語の場合、オブジェクトは、処理だけではなく、データも保持するため、それにかかる記述量が多くなる。対して、手続き型の言語の場合、データは、関数を呼び出す側のプログラムが、関数に対して値を渡す処理を記述する必要がある。

比較項目 クライアント側の
コード量
メソッド側の
コード量
オブジェクト指向 少ない 多い
手続き型 多い 少ない

例えばオブジェクト指向の場合、オブジェクトの配下にいるオブジェクトについて意識する必要は無くなり、〜と記述するだけでよくなる。反対にて手続き型の場合、引数を与える必要があるため、〜と記述せねばならず、関数の構造を意識しなければならない。

よく定義されたプログラムは、業務ロジックに近くなる。実際の自然言語に、より近い形で、処理を記述できるようになる、ような気がする。ただし、よく定義されていないクラス、下位側のオブジェクトを意識しなければならないコードは、この限りではない。

凝集度 - Wikipedia



#### 1. そこまでして関数を使うなら
メソッドが存在する必要なくない?
答え: メソッドは必要です。何故なら、多態性が実現できなくなるから。



メソッドなら多態性が使える。
```python
lst = [boy, girl]
for person in lst:
person.say_hello()
# こんにちは!
# ごきげんよう
```



関数では多態性は使えない。

都度、関数を指定しないといけない。
```python
Boy.say_hello(boy)
# こんにちは!
Girl.say_hello(girl)
# ごきげんよう
```



メソッドが必要ない訳ではない。

この len については関数で実装できてしまう。

だから関数にしている。



ちなみに Boy, Girl はこんなクラス。
```python
class Person(object):
def say_hello(self):
raise NotImplementedError

class Boy(Person):
def say_hello(self):
print('こんにちは!')

class Girl(Person):
def say_hello(self):
print('ごきげんよう')

boy = Boy()
girl = Girl()
```