導入
クリーンアーキテクチャは、ソフトウェアの設計において、可読性や保守性を高めるための強力なアプローチです。しかし、実際の開発現場では、理想的な設計から逸脱し、アンチパターンに陥ることが少なくありません。このシリーズでは、特に中級エンジニアが直面しやすい具体的なアンチパターンを取り上げ、どのようにそれを回避するかを考察します。
教科書レベルの解説(クリーンアーキテクチャ)
重要な概念の整理
クリーンアーキテクチャは、ソフトウェアの依存関係を管理し、ビジネスロジックを他の要素から分離することを目的としています。これにより、テストが容易になり、変更に強い設計が実現します。特に、アプリケーションのコアとなる部分は、外部の影響を受けないように設計されるべきです。
コード例(JavaScript)
class UserRepository {
constructor(database) {
this.database = database;
}
getUserById(id) {
return this.database.find(user => user.id === id);
}
}
class UserService {
constructor(userRepository) {
this.userRepository = userRepository;
}
getUserProfile(id) {
return this.userRepository.getUserById(id);
}
}
コードの行ごとの解説
- UserRepositoryクラスは、データベースへのアクセスを管理します。依存性の注入により、異なるデータベース実装に対応可能です。
- UserServiceクラスは、ビジネスロジックを実装しています。ユーザー情報の取得を担当し、リポジトリに依存しています。
アンチパターン編
クリーンアーキテクチャを実践する際によく見られるアンチパターンの一つが、ビジネスロジックとデータアクセスの混在です。以下のコード例を見てみましょう。
class UserService {
constructor(database) {
this.database = database;
}
getUserProfile(id) {
return this.database.find(user => user.id === id);
}
}
この実装では、UserServiceがデータベースへの直接的な依存を持っています。この設計は、将来的にデータベースの変更やテストの難しさを招く可能性があります。理想的には、UserRepositoryを介してデータを取得するべきです。
改善点としては、依存性の注入を用いて、UserServiceがUserRepositoryを利用するように修正することです。これにより、ビジネスロジックがデータアクセスから切り離され、テストが容易になります。
まとめ
- クリーンアーキテクチャでは、ビジネスロジックとデータアクセスを分離することが重要です。
- 依存性の注入を活用することで、テストの効率が向上し、将来的な変更にも柔軟に対応できます。