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

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()