2
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原則-メモ1

Last updated at Posted at 2023-09-26

依存性逆転の原則について

依存性逆転の原則(Dependency Inversion Principle, DIP)は、SOLID原則の一つであり、ソフトウェア設計において、以下の二つの主要なガイドラインを提供します.

上位モジュールは下位モジュールに依存すべきではない。どちらのモジュールも「抽象」に依存すべきである。

  • 「上位モジュール」とは、ビジネスロジックやアプリケーションの核心ロジックを含むモジュールです。
  • 「下位モジュール」とは、データアクセスロジックやI/O処理などの具体的な詳細を含むモジュールです。

抽象は具体に依存すべきではない。具体が抽象に依存すべきである。

  • 「抽象」はインターフェースや抽象クラスを意味し、具体的な実装から分離された定義です。
  • 「具体」は抽象に対する具体的な実装を意味します。

具体的な適用方法

依存性注入(Dependency Injection)
上位モジュールに下位モジュールのインスタンスを外部から注入します。

インターフェースや抽象クラスの利用
上位モジュールは具体的な下位モジュールではなく、インターフェースや抽象クラスに依存します。

依存関係逆転の原則を適用することで得られる利益

1. 保守性の向上

保守性が向上することで、コードのバグを見つけやすくなり、バグの修正もより迅速に行えます。依存関係逆転の原則を用いると、高レベルのクラスやモジュールが、低レベルのクラスやモジュールの具体的な実装に依存せず、これによって各モジュールの交換や更新が容易になります。

2. 拡張性の向上

依存関係逆転の原則に従った設計では、新しい機能や変更を加えるための拡張ポイントが明確になります。これによって、新しい機能の追加や既存機能の変更が、既存のコードへの影響を最小限に抑えつつ、効率的に行えます。

3. テスト容易性の向上

依存関係逆転の原則を用いると、抽象に依存することでモジュールが疎結合になり、これによって各モジュールを単独でテストすることが容易になります。例えば、モックオブジェクトを使用して、他のモジュールと独立してテストを行えます。

4. リファクタリングの容易性

良好な設計と低い結合度は、コードのリファクタリングを容易にします。コードのリファクタリングが容易であると、コードの品質を保ちつつ、必要に応じて改善や最適化を行うことができます。

5. クリーンアーキテクチャ全体の恩恵

これらの原則は、クリーンアーキテクチャ全体の一部として機能し、それぞれが相互に補完しあいます。ビジネスロジックがインフラストラクチャやフレームワークから独立しているため、テクノロジーの変更やアップグレードが容易になり、ソフトウェアの寿命が延びます。

C#の具体的なコード

1. エンティティ層

ビジネスルールとオブジェクトを定義します。

public class Message
{
    public string Content { get; set; }
}

2. ユースケース層

アプリケーションのビジネスロジックを定義します。また、リポジトリのインターフェースもこの層で定義します。

public interface IMessageRepository
{
    void Save(Message message);
    Message Get();
}

public class MessageService
{
    private readonly IMessageRepository _messageRepository;

    public MessageService(IMessageRepository messageRepository)
    {
        _messageRepository = messageRepository;
    }

    public void SaveMessage(string content)
    {
        var message = new Message { Content = content };
        _messageRepository.Save(message);
    }

    public string GetMessageContent()
    {
        var message = _messageRepository.Get();
        return message.Content;
    }
}

3. インフラストラクチャ層

リポジトリの具体的な実装を提供します。この例ではメモリ内リポジトリを作成しますが、データベースなど他のストレージソリューションに容易に変更できます。

public class InMemoryMessageRepository : IMessageRepository
{
    private Message _message;

    public void Save(Message message)
    {
        _message = message;
    }

    public Message Get()
    {
        return _message;
    }
}

依存関係逆転の解説

  • IMessageRepositoryインターフェースは、ユースケース層で定義され、具体的な実装はインフラストラクチャ層で行われます。これにより、MessageServiceは低レベルの詳細(具体的なデータ保存の方法)に依存せず、抽象に依存します。

  • MessageServiceはコンストラクタインジェクションを通じてIMessageRepositoryのインスタンスを受け取ります。これにより、MessageServiceとIMessageRepositoryの具体的な実装との間の結合が疎になります。

  • この設計において、MessageService(ビジネスロジック)は、IMessageRepositoryの具体的な実装やデータ保存の詳細から分離されています。これにより、ビジネスロジックのテストや拡張が容易になりますし、データ保存の方法を変更する際も、ビジネスロジックに影響を与えることなく行うことができます。

実行コード

実際にアプリケーションを実行するためのコード例です。

class Program
{
    static void Main()
    {
        IMessageRepository messageRepository = new InMemoryMessageRepository();
        MessageService messageService = new MessageService(messageRepository);

        messageService.SaveMessage("Hello, Dependency Inversion Principle!");
        Console.WriteLine(messageService.GetMessageContent()); // Outputs: Hello, Dependency Inversion Principle!
    }
}

このProgramクラスでは、具体的なIMessageRepositoryの実装(InMemoryMessageRepository)をインスタンス化し、MessageServiceに注入しています。これにより、MessageServiceのビジネスロジックが具体的なデータ保存の方法から完全に独立することができます。

まとめ

今回調べたことで,以下の事が分かった.
依存関係逆転の原則とクリーンアーキテクチャは、長期にわたってソフトウェアを健全に保つための効果的なアプローチである。これらの原則を適用することで、ソフトウェア開発プロジェクトは、変更に強く、拡張しやすく、保守しやすくなる。また、これらの原則は、開発チームがソフトウェアの品質を維持し、プロジェクトのリスクを管理するのに役立つ。

2
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
2
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?