私は常に Rust と GoLang の大ファンです。彼らのプログラミングへのアプローチ、特にエラー処理におけるアプローチは、私のキャリアを通じてずっと私の心に響きました。 4 年以上 GoLang 開発に専念した後、私は最近、従来の PHP コードをより新しい、より堅牢なバージョンにリファクタリングするプロジェクトに移行しました。この変化は、特に PHP の従来のエラー処理メカニズムに適応する場合、刺激的であると同時に困難でもありました。
Go の「値としてのエラー」の概念に慣れてきたので、従来の try-catch パラダイムに依存する言語に戻すことは、重要な調整でした。例外を通して予想外のことが起こるという考えは直観に反しているように思えます。 GoLang では、エラーは関数が生成できる明示的な戻り値として扱われるため、開発者はエラーを直接処理する必要があります。この明示性により明確さが促進され、すべての関数呼び出しでの徹底的なエラー チェックが促進されます。
対照的に、例外ベースのエラー処理では、エッジ ケースが見落とされることがあります。すべての開発者が避けたいシナリオであるアプリケーションがクラッシュした場合にのみ、例外をスローする関数を呼び出して本番環境での見落としを発見することも可能です。
この課題に対処するために、PHP コントローラー メソッドに Rust からインスピレーションを得た Result 型を導入することにしました。 Rust のエラー処理アプローチは、Go と同様に、成功または失敗を明示的に示す結果を返すことに重点を置いています。 PHP で Result 型を実装することで、現在のプロジェクトにこのレベルの明示性と安全性をもたらすことを目指しました。
たとえば、ユーザー登録エンドポイントでは、Laravel のバリデーターをラップして、有効な値またはエラーのいずれかを含む Result を返します。この変更により、検証の失敗を明示的に処理できるようになり、アプリケーションが必要に応じて 422 Unprocessable Entity ステータス コードを返すことができるようになります。これにより、エラー処理がより透明になるだけでなく、すべての潜在的なエラーが考慮され、適切に管理されるようになるため、API の信頼性も向上します。
このアプローチから私が観察した主な利点をいくつか示します:
この方法論をより明確に説明するために、言語間の対照と類似点を強調し、特定のパターンを採用することでコードがより堅牢で保守しやすくなる方法を示す 3 つのコード例を用意しました。
このアプローチについてのご意見を聞きたいです。ある言語の概念を別の言語に組み込むことは、長期的には有益だと思いますか?
お気軽に体験を共有したり、ご質問ください。
以上がPHP での Result