オブジェクト指向はなぜ生まれたのか(ドラえもんに聞いてみた)
オブジェクト指向はなぜ生まれたのか(ドラえもんに聞いてみた)
#理由ⅰ) グローバル変数を使わなくてよいから 。
#理由ⅱ) 変数を使ってcode再利用性がよくなるから(関数の変数では限界があるから)
#この二点である。
ではこの二点の説明を詳しく説明するために、プログラミングの核である『変数』を『ドラえもんの四次元ポケット』だと仮定する。
#下記に四次元ポケットとドラえもん達を記した地図を見ながら説明をする。
#関数内の『②ローカル変数』は野比家の中にある『四次元ポケット』であり、家族以外と家の外では使用できない条件とする。
#『①グローバル変数』は世界の中にある『四次元ポケット』であり、誰でもとこからでも使用できる条件とする。
#クラス内の『③インスタンス変数』は東京都の中にある『四次元ポケット』であり、都民以外と都外では使用できない条件とする。
#野比家、出来杉家。骨川家、剛田家、学校などは関数とする。
では四次元ポケットを使ってみよう。
#グローバル四次元ポケットにドラえもんを入れ、次の日四次元ポケットからドラえもんを取出そうとしたところ、中には何も入っていなかった。これは地球の人がどこからでも四次元ポケットを使えるため中身が変わっていたのである。
#これがグローバル変数の欠点である。
#では、家族以外使えないように関数内のローカル四次元ポケットにドラえもんを入れ、次の日学校で四次元ポケットからドラえもんを取出そうとしたところ、野比家の外では四次元ポケットが使えないことが分かったのである。
#これが関数の限界である。
#この二点を改善したものがクラスである。では使ってみよう。
#クラス内のインスタンス四次元ポケットにドラえもんを入れると、都内の野比家、学校、出来杉家。骨川家、剛田家などの関数内でもドラえもんを取出すことができるのである。またクラスの範囲を都内よりも狭くすることでグローバル四次元ポケットで起きた欠点を改善することができる。
#グローバル四次元ポケットには、都外の千葉県を入れることも、21世紀を入れることもできるのである。21世紀からドラミと千葉県のミッキーマウスを野比家に呼んでみよう。
#以下にpythonのcodeを記載する。
import sys
class Tokyo_class(object):
"""東京都"""
def __init__(self, name):
self.name = name #インスタンス四次元ポケット
def nobi_house(self):
"""野比家にて四次元ポケットを使う"""
print(f'-----{sys._getframe().f_code.co_name}-now----')
self.name.hello()
self.name.items(0)
def school(self):
"""学校にて四次元ポケットを使う"""
print(f'-----{sys._getframe().f_code.co_name}-now----')
self.name.hello()
self.name.items(1)
def gouda_house(self):
"""剛田家にて四次元ポケットを使う"""
print(f'-----{sys._getframe().f_code.co_name}-now----')
self.name.hello()
self.name.items(2)
class Century21(object):
"""21世紀の世界"""
def __init__(self, name):
self.name = name
self.secret_items = {0:'タケコプター', 1:'コンピューターペンシル', 2:'音消しマイク'}
def hello(self):
if self.name == "ドラえもん":
print(f'ぼく、{self.name}')
else:
print(f'ドラえもんじゃないよ、{self.name}だよ')
def items(self, num):
print(f'ジャジャーン、{self.secret_items[num]}')
class Tiba_class(object):
"""千葉県"""
def __init__(self, name):
self.name = name
self.secret_items = {0:'チーズ', 1:'マーガリン', 2:'バター'}
def hello(self):
print(f'{self.name}だよ')
def items(self, num):
print(f'ジャジャーン、{self.secret_items[num]}')
for key, val in {"tokyo_doraemon": Century21("ドラえもん"), "tokyo_dorami": Century21("ドラミ"), "tokyo_mickey": Tiba_class("ミッキー")}.items():
key = Tokyo_class(val) #インスタンス作成
key.nobi_house() #野比家にて四次元ポケットを使う
key.school() #学校にて四次元ポケットを使う
key.gouda_house() #剛田家にて四次元ポケットを使う
-----nobi_house-now----
ぼく、ドラえもん
ジャジャーン、タケコプター
-----school-now----
ぼく、ドラえもん
ジャジャーン、コンピューターペンシル
-----gouda_house-now----
ぼく、ドラえもん
ジャジャーン、音消しマイク
-----nobi_house-now----
ドラえもんじゃないよ、ドラミだよ
ジャジャーン、タケコプター
-----school-now----
ドラえもんじゃないよ、ドラミだよ
ジャジャーン、コンピューターペンシル
-----gouda_house-now----
ドラえもんじゃないよ、ドラミだよ
ジャジャーン、音消しマイク
-----nobi_house-now----
ミッキーだよ
ジャジャーン、チーズ
-----school-now----
ミッキーだよ
ジャジャーン、マーガリン
-----gouda_house-now----
ミッキーだよ
ジャジャーン、バター
まとめ
#インスタンス四次元ポケットが出来る限り広い範囲で使えるということのどこが凄いのか伝わり難いかもしれない。そんな時はクラスを使わずとも変数を使うことでcodeの再利用性が格段に上がることを思い出してほしい。そして、クラスを使うと更にcodeの再利用性が格段に上がるのである。
#余談、Reactjsは『オブジェクト指向はなぜ生まれたのか』の理由を克服した関数型プログラミングである。Reactコンテキストで『関数の変数の限界』を克服し、Providerで限定スコープを作ることで、どこからでも変数を使えるグローバル変数の欠点を克服している。
Discussion