オブジェクト指向のメリット
辞書に関数を付け加えること。これによって、手続き型と、どうコーディングが変わるのか?
究極関数を import してしまえば、それで同じじゃないの?
- 関数を import しなくてよくなる。
決定的な違いは
- 関数がどの辞書に属しているか、決めないといけない。
は、この際、副次的な効果でしかない。カプセル化こそが、多態性こそが、カプセル化こそが、という話はあるけど、たとえそれをしていてもオブジェクト指向とは認識してくれない。線引きはどこにあるのか?
- どのオブジェクトに属性ているのか?
- 引数が、1つだけの場合
- 副作用が、1つの引数に対してのみの場合
そのほかの方法
- 要件定義をして動詞を洗い出す。
- 要件定義からのオブジェクト指向の練習, DB にも繋がるか...
(殴り書き、書き途中、たぶん、違うと思う...。)
可読性が上がること
理由は、メソッドを呼び出すクライアント側のプログラムが、コードが短くなるから。オブジェクト指向においては、プログラマがプログラミングをする際に、1度に頭の中で意識するべき範囲を狭めることに役立ち、可読性があがると言える。
オブジェクト指向言語の場合、オブジェクトは、処理だけではなく、データも保持するため、それにかかる記述量が多くなる。対して、手続き型の言語の場合、データは、関数を呼び出す側のプログラムが、関数に対して値を渡す処理を記述する必要がある。
比較項目 | クライアント側の コード量 |
メソッド側の コード量 |
---|---|---|
オブジェクト指向 | 少ない | 多い |
手続き型 | 多い | 少ない |
例えばオブジェクト指向の場合、オブジェクトの配下にいるオブジェクトについて意識する必要は無くなり、〜と記述するだけでよくなる。反対にて手続き型の場合、引数を与える必要があるため、〜と記述せねばならず、関数の構造を意識しなければならない。
よく定義されたプログラムは、業務ロジックに近くなる。実際の自然言語に、より近い形で、処理を記述できるようになる、ような気がする。ただし、よく定義されていないクラス、下位側のオブジェクトを意識しなければならないコードは、この限りではない。
#### 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()
```