0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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のサービスコンテナと依存性注入を使うことで、依存性逆転の原則を簡単に実践することができます。

依存性逆転の原則は以上です。ありがとうございました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?