未来の私へ送るデザインパターン 補講1 [オブジェクト指向で再利用ってどうするの?]
今回は、DesignPatternを勉強していて疑問に思ったことを書いていきます~
参考はいつものGoF本です~
それでは今回の内容について話していきましょう~
DesignPatternというかオブジェクト指向についての疑問点だったのですが、
オブジェクト指向を適用することで再利用性が高くなる、というのが特長として挙げられています。
ただ、肝心の「再利用ってどうすればいいの?」部分が結構もやっとしていたのです。
たまたまGoF本を読んでいたら、再利用についての記載があったおかげでCacaponのもやもやは7割方解決出来ました。
今回はそのもやもやの部分ともやもやが解決した部分をブログにまとめられたらなと思います~
オブジェクト指向で再利用するやり方は大きく分けて二つある
オブジェクト指向での再利用方法は「継承」と「オブジェクトコンボジション」があります。
継承は、親クラスを引き継いで新しい子クラスを作るといった感じですね。
オブジェクトコンボジションは生成したオブジェクトを組み合わせて機能を作るといった感じでしょうか。
ただ、継承は親クラスの実装が子クラスに影響を与える密な関係になっているため、
使用する場合は実装がない抽象クラスから継承するなど、
気を付けて実装しないとカプセル化が壊れてしまいます。
んで、読み続けたところ、著者的には「継承よりオブジェクトコンボジションを多用すべき」との考えのようです。
なぜなら、オブジェクトコンボジションで作るとカプセル化が壊れないから。(他にも色々理由はあるみたいですが…)
私自身も中に影響とか与える実装は作りたくないので、この考えで実装できればと思います~
ただ、慣れていないので試しに作ってみました~
間違っていたりしたらコメントとか書いてくれるとうれしいです~
## pythonでの実装例
# display.py 画面に表示します。
class Display():
def show(self, data):
print(data)
# calc.py 1から10までの合計を返します class Calc(): def oneforten(self): total = 0 for num in range(1, 11): # start <= num < end のため、10ではなく11にしている total += num return total
# 誕生日のメッセージを返します。 class Message(): def HappyBirthday(self): return 'Happy Birthday'
# client.py 部品をくっつけたりしてます。 from display import Display from calc import Calc from message import Message class client(): def __init__(self): # 部品を準備します。 self.display = Display() self.calc = Calc() self.message = Message() def comboA(self): # displayとcalcを組み合わせます。 self.display.show(self.calc.oneforten()) def comboB(self): # displayとmessageを組み合わせます。 self.display.show(self.message.HappyBirthday()) if __name__ == "__main__": # おそらくオブジェクトコンボジションのイメージ user = client() # 部品をくっつけます。 user.comboA() # くっつけてできたパーツAを呼び出します。 user.comboB() # くっつけてできたパーツBを呼び出します。
$ python client.py
55
Happy Birthday
とりあえず、cacapon的にはうまく行ったかなと思います~
無事に
「1から10までの合計を表示するプログラム」
「誕生日メッセージを表示するプログラム」
を作ることが出来ました~
実装見ればわかると思うんですけど、
関数同時をくっつけているだけで、
中を気にしなくてもいいんです。
そして、displayのオブジェクトと繋げるオブジェクトを変えるだけで、
全く別の機能を持つプログラムを作ることが出来ました。
これが本来のオブジェクト指向の威力なのでしょう…
難しそうなのは、結びつきで機能になるので、
コード上には
「1から10までの合計を表示するプログラム」
「誕生日メッセージを表示するプログラム」
と分からない事でしょうか。(しいて言うならComboA、Bがそれにあたる??)
後は、インターフェースをしっかり意識して作らないと
機能しないかなというところでしょうか…
後、疑問点なのが今回client.pyで組み立てしましたが、
実際の所はどいつが担当なのかも知りたいですね~
複雑な例だと実装難易度が上がりそうですが、
頑張って「オブジェクトコンボジション」な実装とか設計が
できるといいなと思うcacaponなのでした~