類別初期都很守規矩,隨著時間它會責任變重,複雜到失去彈性。
拆開時機有二:

Extract Class
- 看到資料或方法該放一起
- 有群資料同時改變和互相依賴
我們也可藉自問「移除某段資料或方法,是否會讓其他欄位或方法變不合理」做提取依據。
classDiagram
direction LR
class Employee_Before {
+name
+email
+street
+city
+zip_code
+print_details()
}
class Employee_After {
+name
+email
+address: Address
+print_details()
}
class Address {
+street
+city
+zip_code
+print_address()
}
Employee_Before ..> Employee_After : 重構
Employee_After --> Address : 組合# Before
class Employee:
def __init__(self, name, email, street, city, zip_code):
self.name = name
self.email = email
self.street = street
self.city = city
self.zip_code = zip_code
def print_employee_details(self):
print(f"Name: {self.name}")
print(f"Email: {self.email}")
print(f"Address: {self.street}, {self.city}, {self.zip_code}")
# After
class Address:
def __init__(self, street, city, zip_code):
self.street = street
self.city = city
self.zip_code = zip_code
def print_address(self):
print(f"Address: {self.street}, {self.city}, {self.zip_code}")
class Employee:
def __init__(self, name, email, address):
self.name = name
self.email = email
self.address = address
def print_employee_details(self):
print(f"Name: {self.name}")
print(f"Email: {self.email}")
self.address.print_address()