SOLID原則について学習しましたのでアプトプットもかねて載せます。
SOLIDとは
オブジェクト指向プログラミングにおいて、柔軟性、保守性の高いソフトウェアを設計するための5つの原則の頭文字をとったマクロニム(略語)です。
5つの原則
1 単一責任の原則
2 オープンクローズドの原則
3 リスコフの置換原則
4 インターフェース分離の原則
5 依存性逆転の原則
今回は5 依存性逆転の原則(DIP)について説明します。
依存性逆転の原則(DIP)とは
依存性逆転の原則とは高レベルのモジュールは低レベルのモジュールに依存するべきではなく、
どちらのモジュールも抽象に依存に依存すべきたどいう原則です。具体的にはインターフェースを介して依存関係を持つことでコードの結合度を低くして、拡張や変更が簡単になるという考え方です。
Laravelでは依存性逆転の原則を実現するために、依存性注入とサービスプロバイダーを使うことで依存関係を解決し、クラス間の結合を疎結合に保ちつつ、柔軟で拡張性のある設計が実現できます。
例を使って説明します。
例として、ユーザー情報を取得するサービスクラスUserServiceがあります。UserServiceは、リポジトリを使ってデータベースからユーザー情報を取得します。
class UserService
{
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function getUser($userId)
{
return $this->userRepository->find($userId);
}
}
上記のUserServiceは依存関係を解決するために、UserRepositoryをコンストラクタインジェクションにより受け取っています。これにより、UserServiceはUserRepositoryに依存しています。しかし、依存性逆転の原則を考慮すると、高レベルのUserServiceが低レベルのUserRepositoryに直接依存すべきではないとされます。
この問題を解決するために、インターフェースを導入します。UserServiceはUserRepositoryInterfaceというインターフェースに依存するように変更します。
interface UserRepositoryInterface
{
public function find($userId);
}
class UserService
{
private $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function getUser($userId)
{
return $this->userRepository->find($userId);
}
}
これにより、UserServiceは具体的な実装に依存せず、インターフェースに依存するようになりました。具体的な実装はサービスコンテナを使って解決します。
Laravelのサービスコンテナは依存性の注入をサポートし、インターフェースと具体的な実装クラスの紐付けを管理します。例えば、次のようにUserRepositoryクラスをUserRepositoryInterfaceとして登録します。
Provider
app()->bind(UserRepositoryInterface::class, UserRepository::class);
これにより、UserServiceがUserRepositoryInterfaceに依存するようになり、依存性逆転の原則を守ることができます。また、将来的にUserRepositoryの実装を切り替える場合でも、サービスコンテナの設定を変更するだけで切り替えが可能になります。
依存性逆転の原則を守ることで、クラス間の結合度を低くし、柔軟な設計と拡張性を実現することができます。Laravelのサービスコンテナと依存性注入を使うことで、依存性逆転の原則を簡単に実践することができます。
依存性逆転の原則は以上です。ありがとうございました。