deepseek-prompts-code-refactoring-unit-testing

title: "如何用 DeepSeek 提示詞引導高難度代碼重構與單元測試" description: "本文教學如何利用 DeepSeek 提示詞,策略性地指導複雜遺留代碼的重構過程,並生成精準的單元測試,以確保代碼質量與穩定性。" date: 2026-07-20 generated: true tags: ["posts"] layout: "layouts/post.njk" permalink: "/posts/2026-07-20-deepseek-prompts-code-refactoring-unit-testing-532/index.html"

在高強度開發環境中,面對複雜、耦合度高且缺乏良好測試的遺留代碼,執行高難度重構(Refactoring)無疑是一項艱鉅的挑戰。它不僅需要深厚的技術功底,更需要細緻的規劃與嚴謹的驗證,以避免引入新的錯誤。DeepSeek,憑藉其強大的代碼理解與生成能力,能成為您在這類任務中的得力助手。透過精心設計的提示詞(Prompt),您可以引導 DeepSeek 像一位資深架構師或測試工程師般思考,從診斷問題到生成重構方案,再到編寫高質量的單元測試。

理解高難度代碼重構的挑戰

高難度代碼重構通常涉及以下情境:

在這些情況下,傳統的手動重構不僅效率低下,風險也極高。DeepSeek 的介入,能顯著降低重構門檻和風險。

DeepSeek 如何協助代碼分析與重構

DeepSeek 提示詞設計核心原則

要讓 DeepSeek 有效地協助高難度重構,提示詞必須遵循以下原則:

  1. 清晰性與具體性 (Clarity & Specificity): 明確說明你的目標、期望的輸出格式和技術棧。避免模糊的指令。
  2. 逐步引導 (Step-by-step Guidance): 將重構這個大任務拆解成小步驟,每次讓 DeepSeek 專注於一個子任務。
  3. 提供上下文 (Context Provision): 餵入相關的代碼片段、業務邏輯、錯誤日誌或架構圖。上下文越豐富,DeepSeek 的理解越精準。
  4. 角色扮演 (Role-playing): 為 DeepSeek 設定一個角色(例如:資深架構師、單元測試專家、性能優化工程師),引導其輸出特定視角的建議。
  5. 迭代與優化 (Iteration & Refinement): DeepSeek 的輸出不是終點,而是起點。根據其輸出,進一步提問、修正或深入探討。

階段一:診斷與重構策略規劃

這是重構的第一步,也是最關鍵的一步。透過 DeepSeek 協助,我們可以快速識別問題並制定合理策略。

1.1 分析現有代碼問題

提供要重構的代碼片段,要求 DeepSeek 識別其潛在問題。

提示詞範例:

你是一位資深軟件架構師。我正嘗試重構以下 Python 函數。請你分析這段代碼,指出其中存在的潛在問題,例如:高耦合度、邏輯重複、缺乏錯誤處理、性能瓶頸、可讀性差、不易測試等。請針對每個問題點提供簡要說明。

```python
# 原始的複雜函數
def process_customer_order(customer_id, items, shipping_address, payment_info):
    # 步驟 1: 驗證用戶身份
    user = db.get_user(customer_id)
    if not user or not user.is_active:
        raise ValueError("Invalid customer or inactive account.")

    # 步驟 2: 計算訂單總價
    total_amount = 0
    for item_id, quantity in items.items():
        product = db.get_product(item_id)
        if not product or product.stock < quantity:
            raise ValueError(f"Product {item_id} out of stock or invalid.")
        total_amount += product.price * quantity
        product.stock -= quantity # 直接修改庫存

    # 步驟 3: 處理支付
    payment_status = payment_gateway.charge(payment_info, total_amount)
    if payment_status != "SUCCESS":
        raise PaymentError("Payment failed.")

    # 步驟 4: 創建訂單記錄
    order_id = db.create_order(customer_id, items, total_amount, shipping_address, payment_status)
    db.update_product_stock(items) # 更新所有商品的庫存
    
    # 步驟 5: 發送確認郵件
    email_service.send_order_confirmation(user.email, order_id, total_amount)

    return order_id

**DeepSeek 預期輸出:**

*   單一職責原則(SRP)被違反:函數承擔了用戶驗證、庫存管理、支付處理、訂單創建、郵件通知等多項職責。
*   高耦合度:直接依賴 `db`、`payment_gateway`、`email_service` 等多個外部服務。
*   錯誤處理不一致:使用 `ValueError` 和 `PaymentError`,且未處理所有潛在異常(如網絡錯誤)。
*   事務性問題:如果在支付成功後創建訂單失敗,庫存已經被修改,可能導致數據不一致。
*   不易測試:難以模擬多個外部依賴,單元測試複雜。
*   直接修改參數:`product.stock -= quantity` 在循環中直接修改數據,可能不易追蹤。

### 1.2 制定重構路線圖

根據 DeepSeek 分析出的問題,進一步要求其制定重構策略。

**提示詞範例:**

基於你對上述 process_customer_order 函數的分析,請你作為重構專家,提出一個分階段的重構路線圖。請清晰列出每個階段的目標、主要任務,並建議使用哪些設計模式或原則來解決這些問題。目標是提升模組化、可測試性與可維護性。


**DeepSeek 預期輸出:**

*   **階段一:職責分離與提取服務**
    *   目標:將不同職責分離為獨立的服務或函數。
    *   任務:提取 `UserService`、`ProductService`、`PaymentService`、`OrderService`、`EmailService`。
    *   建議:單一職責原則(SRP)、依賴倒置原則(DIP)。
*   **階段二:引入事務管理與錯誤恢復**
    *   目標:確保操作的原子性,避免數據不一致。
    *   任務:在 `OrderService` 中協調多個操作,考慮使用兩階段提交或補償事務模式。
    *   建議:事務模式、補償模式。
*   **階段三:提升可測試性**
    *   目標:使各服務易於進行單元測試。
    *   任務:通過依賴注入(DI)解耦外部服務。
    *   建議:依賴注入、接口設計。

## 階段二:實施代碼重構

有了路線圖,我們便可以逐步引導 DeepSeek 進行代碼修改。

### 2.1 提取函數/模組

選擇一個明確的子任務,例如將用戶驗證邏輯提取為獨立函數。

**提示詞範例:**

好的,我們從第一階段開始。請你為 process_customer_order 函數中的「驗證用戶身份」邏輯,設計一個新的獨立函數 _validate_user(customer_id)。 新函數應:

  1. 接收 customer_id 作為參數。
  2. 負責從數據庫獲取用戶並驗證其活躍狀態。
  3. 如果用戶無效或不活躍,拋出 ValueError
  4. 返回有效的用戶物件。
  5. 請提供完整的 Python 函數代碼,並說明如何替換原函數中的相關邏輯。

**DeepSeek 預期輸出(代碼示例):**

```python
# 提取後的 _validate_user 函數
def _validate_user(customer_id):
    user = db.get_user(customer_id)
    if not user or not user.is_active:
        raise ValueError("Invalid customer or inactive account.")
    return user

# 原函數中替換邏輯:
# 將
# user = db.get_user(customer_id)
# if not user or not user.is_active:
#     raise ValueError("Invalid customer or inactive account.")
# 替換為
# user = _validate_user(customer_id)

2.2 優化數據結構與算法

針對 DeepSeek 識別出的性能瓶頸,請求其提供優化方案。

提示詞範例:

我注意到 `process_customer_order` 函數中計算訂單總價和更新庫存的邏輯效率可能不高,尤其是當 `items` 列表很大時。目前在循環中頻繁查詢單個商品和更新單個庫存。
請你作為性能優化專家,建議如何優化這部分邏輯?考慮減少數據庫I/O。請提供優化後的 Python 代碼片段,以及簡要的優化說明。

DeepSeek 預期輸出(代碼示例與說明):

工程師協作與 DeepSeek 輔助開發

階段三:生成與執行單元測試

重構後的代碼必須有充分的單元測試覆蓋,才能確保其穩定性。DeepSeek 在這裡可以幫助我們快速生成測試用例。

3.1 為重構後的代碼生成單元測試

針對重構後的獨立函數,要求 DeepSeek 編寫單元測試。

提示詞範例:

現在我們有了重構後的 `_validate_user(customer_id)` 函數(假定它現在是 `UserService.validate_user` 方法)。請你作為單元測試專家,為此函數使用 `pytest` 和 `unittest.mock` 編寫單元測試。
你需要考慮以下測試場景:
1.  用戶存在且活躍。
2.  用戶不存在。
3.  用戶存在但不活躍。
4.  請提供完整的測試代碼,並確保 mock 了所有外部依賴(如 `db` 服務)。

```python
# 假設這是重構後的 UserService.py 中的方法
class UserService:
    def __init__(self, db_service):
        self.db_service = db_service

    def validate_user(self, customer_id):
        user = self.db_service.get_user(customer_id)
        if not user or not user.is_active:
            raise ValueError("Invalid customer or inactive account.")
        return user

# 假設 db_service 有一個 get_user 方法,返回一個 user 物件,該物件有 is_active 屬性
class MockUser:
    def __init__(self, is_active):
        self.is_active = is_active

**DeepSeek 預期輸出(Pytest 測試代碼):**

```python
import pytest
from unittest.mock import Mock
from your_module import UserService, MockUser # 假設 UserService 和 MockUser 在你的模組中

class TestUserService:

    @pytest.fixture
    def mock_db_service(self):
        return Mock()

    @pytest.fixture
    def user_service(self, mock_db_service):
        return UserService(mock_db_service)

    def test_validate_user_active(self, mock_db_service, user_service):
        """測試用戶存在且活躍的場景"""
        mock_user = MockUser(is_active=True)
        mock_db_service.get_user.return_value = mock_user
        
        user = user_service.validate_user(123)
        assert user == mock_user
        mock_db_service.get_user.assert_called_once_with(123)

    def test_validate_user_not_found(self, mock_db_service, user_service):
        """測試用戶不存在的場景"""
        mock_db_service.get_user.return_value = None
        
        with pytest.raises(ValueError, match="Invalid customer or inactive account."):
            user_service.validate_user(456)
        mock_db_service.get_user.assert_called_once_with(456)

    def test_validate_user_inactive(self, mock_db_service, user_service):
        """測試用戶存在但不活躍的場景"""
        mock_user = MockUser(is_active=False)
        mock_db_service.get_user.return_value = mock_user
        
        with pytest.raises(ValueError, match="Invalid customer or inactive account."):
            user_service.validate_user(789)
        mock_db_service.get_user.assert_called_once_with(789)

3.2 測試覆蓋率與斷言優化

可以進一步要求 DeepSeek 審查測試代碼,確保覆蓋率和斷言的充分性。

提示詞範例:

請檢查上述為 `UserService.validate_user` 編寫的 pytest 測試代碼。作為測試覆蓋率專家,你認為這些測試是否足夠?是否存在任何遺漏的邊界條件、異常路徑或斷言可以增強?如果需要,請建議並補充新的測試用例或修改現有測試。

DeepSeek 預期輸出:

進階技巧:與 DeepSeek 持續對話

重構是一個迭代的過程。DeepSeek 的價值在於其能夠在整個過程中提供持續的支援。

  1. 錯誤排查協助: 當重構後出現新的錯誤或測試失敗時,將錯誤堆棧(Stack Trace)、相關代碼和問題描述提供給 DeepSeek,讓它協助分析可能的原因和解決方案。
  2. 設計模式諮詢: 在重構中遇到複雜的設計問題時,諮詢 DeepSeek 關於合適的設計模式。
  3. 文檔生成與註釋: 重構後通常需要更新文檔。DeepSeek 可以幫助生成代碼註釋或更新技術文檔。

總結

利用 DeepSeek 提示詞引導高難度代碼重構與單元測試,不再是遙不可及的夢想。透過結構化、逐步引導的對話,DeepSeek 能有效扮演多重角色,從最初的代碼診斷、策略規劃,到具體的代碼重構實施,乃至於關鍵的單元測試生成與優化。這不僅顯著提升了重構的效率,更降低了因人為疏忽帶來的風險,最終幫助開發團隊以更高的信心交付質量更優的軟件產品。記住,關鍵在於將複雜問題拆解,並以清晰、具體的語言與 DeepSeek 進行協作。