続:オブジェクト指向プログラミングの基本的な概念の話【コンポジション】


前回:オブジェクト指向プログラミングの基本的な概念の話【カプセル化・抽象化・ポリモーフィズム・継承】
今回は前回の続きで、扱っていなかった概念である「コンポジション」をまとめます。
参考書:独学プログラマー Python言語の基本から仕事のやり方まで(第13章)
参考記事:オブジェクト指向によるクラス設計

コンポジション

やること・出来ること

  • 「is-a関係」(継承)に対応する「has-a関係」を実現する。(例えば飼い主と飼い犬の関係など)これにより、オブジェクトで表現できる幅が広がる。具体的にはクラス間の関係を表現することができる。(=人間の思考に合わせたデータの持ち方・処理を実現できる)

お気持ち

 個人的な理解としては、人間は人間の思考で考えるので、基本的に人間の考える方法で処理できるほうがわかりやすい。そのためデータや処理の持ち方も、人間の言語や思考と似た形にしたほうが扱いやすい。
(高水準言語は、低水準言語より扱いやすいという話と同じ)

 となると、思考方法が文化によって異なるので、日本語文化圏に合った処理方法、プログラミング言語もあるのだろうか。(研究されてそう。)

具体例

Composition.py
class Dog:
    def __init__(self, name, breed, owner):
        self.name  = name
        self.breed = breed
        self.owner = owner
class Person:
    def __init__(self, name):
        self.name = name

## 飼い主
gian = Person("Goda Takeshi")
## 飼い犬(引数にPersonオブジェクトを渡している)
muku = Dog("Muku", "Crossbreed", gian)

## Dogオブジェクトに内包(コンポジション)されている
## Personオブジェクトのnameメソッドを呼び出している
print(muku.owner.name)

実行結果

Goda Takeshi