首頁 >後端開發 >php教程 >快速失敗

快速失敗

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-08 12:33:12331瀏覽

Fail Fast

核心原則

故障發生後立即偵測並報告,防止無效狀態在系統中傳播。

1. 輸入驗證

class UserRegistration {
    public function register(array $data): void {
        // Validate all inputs immediately
        $this->validateEmail($data['email']);
        $this->validatePassword($data['password']);
        $this->validateAge($data['age']);

        // Only proceed if all validations pass
        $this->createUser($data);
    }

    private function validateEmail(string $email): void {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new ValidationException('Invalid email format');
        }
        if ($this->emailExists($email)) {
            throw new DuplicateEmailException('Email already registered');
        }
    }
}

目的:

  • 防止無效資料進入系統
  • 透過在複雜操作之前失敗來節省資源
  • 提供使用者清晰的錯誤訊息
  • 維護資料完整性

2. 配置載入

class AppConfig {
    private array $config;

    public function __construct(string $configPath) {
        if (!file_exists($configPath)) {
            throw new ConfigurationException("Config file not found: $configPath");
        }

        $config = parse_ini_file($configPath, true);
        if ($config === false) {
            throw new ConfigurationException("Invalid config file format");
        }

        $this->validateRequiredSettings($config);
        $this->config = $config;
    }

    private function validateRequiredSettings(array $config): void {
        $required = ['database', 'api_key', 'environment'];
        foreach ($required as $key) {
            if (!isset($config[$key])) {
                throw new ConfigurationException("Missing required config: $key");
            }
        }
    }
}

目的:

  • 確保應用程式以有效的設定啟動
  • 防止因缺少設定而導致執行時錯誤
  • 使設定問題立即可見
  • 簡化偵錯設定問題

3. 資源初始化

class DatabaseConnection {
    private PDO $connection;

    public function __construct(array $config) {
        try {
            $this->validateDatabaseConfig($config);
            $this->connection = new PDO(
                $this->buildDsn($config),
                $config['username'],
                $config['password'],
                [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
            );
        } catch (PDOException $e) {
            throw new DatabaseConnectionException(
                "Failed to connect to database: " . $e->getMessage()
            );
        }
    }

    private function validateDatabaseConfig(array $config): void {
        $required = ['host', 'port', 'database', 'username', 'password'];
        foreach ($required as $param) {
            if (!isset($config[$param])) {
                throw new DatabaseConfigException("Missing $param in database config");
            }
        }
    }
}

目的:

  • 確保資源正確初始化
  • 防止應用程式使用無效資源運作
  • 使資源問題在啟動期間可見
  • 避免因無效資源而導致的級聯失敗

4. 外部服務調用

class PaymentGateway {
    public function processPayment(Order $order): PaymentResult {
        // Validate API credentials
        if (!$this->validateApiCredentials()) {
            throw new ApiConfigurationException('Invalid API credentials');
        }

        // Validate order before external call
        if (!$order->isValid()) {
            throw new InvalidOrderException('Invalid order state');
        }

        try {
            $response = $this->apiClient->charge($order);

            if (!$response->isSuccessful()) {
                throw new PaymentFailedException($response->getError());
            }

            return new PaymentResult($response);
        } catch (ApiException $e) {
            throw new PaymentProcessingException(
                "Payment processing failed: " . $e->getMessage()
            );
        }
    }
}

目的:

  • 防止使用無效資料進行不必要的 API 呼叫
  • 節省時間與資源
  • 提供有關 API 問題的即時回饋
  • 在外部服務互動期間保持系統可靠性

5. 資料處理管道

class DataProcessor {
    public function processBatch(array $records): array {
        $this->validateBatchSize($records);

        $results = [];
        foreach ($records as $index => $record) {
            try {
                $this->validateRecord($record);
                $results[] = $this->processRecord($record);
            } catch (ValidationException $e) {
                throw new BatchProcessingException(
                    "Failed at record $index: " . $e->getMessage()
                );
            }
        }

        return $results;
    }

    private function validateBatchSize(array $records): void {
        if (empty($records)) {
            throw new EmptyBatchException('Empty batch provided');
        }

        if (count($records) > 1000) {
            throw new BatchSizeException('Batch size exceeds maximum limit');
        }
    }
}

目的:

  • 確保整個處理過程中的資料一致性
  • 防止部分處理無效資料
  • 儘早發現資料問題
  • 簡化複雜管道中的錯誤追蹤
  • 在轉換過程中保持資料完整性

快速失敗的好處

  1. 早期錯誤偵測
  2. 更乾淨的調試
  3. 防止級聯故障
  4. 維護資料完整性
  5. 提高系統可靠性

最佳實踐

  1. 使用強型別宣告
  2. 實作徹底的輸入驗證
  3. 拋出特定異常
  4. 在流程的早期進行驗證
  5. 在開發中使用斷言
  6. 實作正確的錯誤處理
  7. 適當記錄失敗

何時使用快速失敗

  1. 輸入驗證
  2. 配置載入
  3. 資源初始化
  4. 外部服務電話
  5. 資料處理管道

以上是快速失敗的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn