この記事では、Pythonプログラミングにおけるクラスのコンポジション(Composition)とアグリゲーション(Aggregation)について詳しく解説します。これらの概念は、オブジェクト指向設計において非常に重要です。具体的なコード例とその解説、さらには応用例を3つ以上掲載しています。
コンポジションとは?
コンポジションとは、あるクラスが別のクラスの一部となる設計手法です。この関係性において、「部分-全体」の関係が成立しています。具体的には、一つのオブジェクトが別のオブジェクトを含む形です。
基本的なコード例
class Engine:
def start(self):
print("エンジン起動")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.start()
print("車が動き始めた")
# 使用例
car = Car()
car.start()
このコードのポイント
上記の例では`Car`クラスが`Engine`クラスを所有しています。このように一つのオブジェクトが別のオブジェクトを内包する関係性をコンポジションと言います。
アグリゲーションとは?
アグリゲーションとは、あるクラスが別のクラスと「持っている(Has-A)」関係にある設計手法です。ただし、この持っている関係はコンポジションよりも疎であり、部分と全体がそれほど密接に結びついていないことが多いです。
基本的なコード例
class Student:
def __init__(self, name):
self.name = name
class Classroom:
def __init__(self):
self.students = []
def add_student(self, student):
self.students.append(student)
# 使用例
s1 = Student("田中")
s2 = Student("佐藤")
classroom = Classroom()
classroom.add_student(s1)
classroom.add_student(s2)
このコードのポイント
この例では`Classroom`クラスが`Student`オブジェクトを持っていますが、`Student`は`Classroom`に依存していません。このような関係性をアグリゲーションと言います。
応用例
1. エンジンの種類を変更可能にする(コンポジション)
class TurboEngine:
def start(self):
print("ターボエンジン起動")
class SportCar(Car):
def __init__(self):
self.engine = TurboEngine()
# 使用例
sport_car = SportCar()
sport_car.start()
この例では、既存の`Car`クラスを継承して`SportCar`クラスを作成しました。そして`SportCar`には`TurboEngine`クラスを内包するようにしています。
2. クラスルームに教科書を追加(アグリゲーション)
class Textbook:
def __init__(self, title):
self.title = title
class AdvancedClassroom(Classroom):
def __init__(self, textbook):
super().__init__()
self.textbook = textbook
# 使用例
math_textbook = Textbook("数学の教科書")
advanced_classroom = AdvancedClassroom(math_textbook)
この例では、`AdvancedClassroom`クラスが`Textbook`オブジェクトも持っている形になっています。
3. 電池の持ち時間を設定する(コンポジション)
class Battery:
def __init__(self, lifetime):
self.lifetime = lifetime
class ElectricCar(Car):
def __init__(self, lifetime):
self.engine = Engine()
self.battery = Battery(lifetime)
# 使用例
electric_car = ElectricCar(100)
まとめ
コンポジションとアグリゲーションは、Pythonにおいても非常に重要なオブジェクト指向設計の手法です。適切に使い分けることで、保守性や拡張性の高いコードを書くことができます。
コメント