當一段程式碼處理多個關注點時,最好將它拆分成獨立的階段或模組。
這讓你能獨立處理某個階段,而不影響其他部分。

Split Phase

編譯器就運用了這個原則,透過不同步驟將高階原始碼轉換成可執行機器碼。
拆分階段也能清楚地顯示哪些資料和函式屬於每個階段。

何時該拆分階段?

  • 多重職責:一個函式執行超過一項明確的任務
  • 未來變更:你希望改變某一部分而不影響其餘部分
  • 提升清晰度:每個階段清楚地展示其輸入、邏輯和輸出

範例#

重構前#

def process_order(data):
    quantity = data["quantity"]
    price = data["price"]
    total = quantity * price

    if data["type"] == "book":
        tax_rate = 0.1
    else:
        tax_rate = 0.2

    tax = total * tax_rate
    return total + tax


if __name__ == "__main__":
    order_data = {"type": "book", "quantity": 4, "price": 150}
    total_cost = process_order(order_data)
    print(f"Total cost: {total_cost}")

重構後#

def calculate_base_total(quantity, price):
    return quantity * price


def calculate_total_with_tax(base_total, item_type):
    if item_type == "book":
        tax_rate = 0.1
    else:
        tax_rate = 0.2
    tax = base_total * tax_rate
    return base_total + tax


if __name__ == "__main__":
    order_data = {"type": "book", "quantity": 4, "price": 150}
    base_total = calculate_base_total(order_data["quantity"], order_data["price"])
    total_cost = calculate_total_with_tax(base_total, order_data["type"])
    print(f"Total cost: {total_cost}")