Ruby 쉽게 배우는 SOLID 원칙⑤ "의존성 역전의 원칙"

9816 단어 Rubysolidtech

SOLID 원칙은


다음 5가지 원칙은 소프트웨어의 확장성과 유지보수성을 높이기 위한 것이다.
  • S(Single-responsibility principle): 단일 책임 원칙
  • O(Open-closed principle): 개방식 폐쇄의 원칙
  • L(Liskov substitution principle): 위험 이전 원칙
  • I(Interface segregation principle): 인터페이스 분리 원칙
  • D(Dependency inversion principle): 의존성 역전의 원칙
  • 의존성 반전의 원칙(DIP)은

  • 상위 모듈은 하위 모듈에 의존해서는 안 됩니다.두 모듈 모두 추상에 의존해야 한다
  • 추상은 실현된 세부 사항에 의존할 수 없다.실현된 세부 사항에 추상적으로 의존해야 한다
  • 이런 원칙.
    이런 말만으로는 무슨 말인지 전혀 모르겠다고 생각해 용어를 정리한 뒤 구체적인 예로 설명한다.

    용어

  • 모듈
  • 는 주로'류'
  • 를 가리킨다
  • 고급 모듈
  • 낮은 모듈 측면 사용
  • 하위 모듈
  • 상위 모듈의 측면용
  • 추상
  • 정적 유형 언어에 자주 등장하는 인터페이스
  • 커넥터
  • 설치되지 않은 내용으로 방법명칭, 파라미터의 유형, 되돌아오는 값의 유형을 정의했다
  • 의존성 반전 원칙에 어긋나는 예


    다음 세 반이 있다고 가정해 보세요.
  • NotificationManager: 공지 후 공동 처리를 위한 클래스
  • SlackNotifier: 슬랙에 알림 클래스
  • MailNotifier: 메일 알림을 하는 클래스
  • class NotificationManager
      def initialize(text)
        @text = text
      end
    
      def notify_to_slack
        SlackNotifier.new(@text).notify
        puts 'ここで通知後の共通処理をしたい'
      end
    
      def notify_by_mail
        MailNotifier.new(@text).notify
        puts 'ここで通知後の共通処理をしたい'
      end
    end
    
    class SlackNotifier
      def initialize(text)
        @text = text
      end
    
      def notify
        # Slackに通知する処理
      end
    end
    
    class MailNotifier
      def initialize(text)
        @text = text
      end
    
      def notify
        # メールで通知する処理
      end
    end
    
    # Slackに通知したいとき
    NotificationManager.new('おはよう').notify_to_slack
    
    # メールで通知したいとき
    NotificationManager.new('おはよう').notify_by_mail
    
    의존성 반전에 적용되는 원칙용어는 다음과 같다.
  • 고급 모듈: NotificationManager
  • 하위 모듈: SlackNotifier, MailNotifier
  • 이 예NotificationManager는 많은 것을 너무 잘 안다.예를 들면 다음과 같다.
  • SlackNotifier 또는 MailNotifier라는 클래스가 있음
  • SlackNotifier 또는 MailNotifiertext를 속성으로 가지고 있음
  • SlackNotifierMailNotifier 방법notify이 있음
  • 이는 NotificationManager라는 상급 모듈이 SlackNotifier 또는 MailNotifier라는 하급 모듈에 의존한다는 것을 보여준다.의존성 역전의 원칙에 어긋난다는 것이다.
    이 원칙에 어긋나는 단점으로 신축LineNotifier 같은 것을 고려하면 신축LineNotifier뿐만 아니라 NotificationManager방법도 준비해야 한다.

    해결책

    notify_to_line에서 NotificationManagerSlackNotifier를 호출하는 것이 아니라 준비MailNotifier와 같은 추상(인터페이스)를 통해 없애는 것이다.
    class NotificationManager
      # `notify`メソッドに応答できる`notifier`を渡すようにする
      def initialize(notifier)
        @notifier = notifier
      end
    
      def notify
        notifier.notify
        puts 'ここで通知後の共通処理をしたい'
      end
    end
    
    # Slackに通知したいとき
    slack_notifier = SlackNotifier.new('おはよう')
    NotificationManager.new(slack_notifier).notify
    
    # メールで通知したいとき
    mail_notifier = MailNotifier.new('おはよう')
    NotificationManager.new(mail_notifier).notify
    
    의존성 반전에 적용되는 원칙용어는 다음과 같다.
  • 고급 모듈: notifier
  • 추상: NotificationManager
  • notifier몰라NotificationManagerSlackNotifier같은 반이 있었으면 좋겠어요.MailNotifier라는 방법을 통해 notify라는 추상(인터페이스)에 호응할 수 있다면 어떤 반이든 문제없다.
    반드시 준비해야 한다notifierLineNotifier도 클래스와 LineNotifier 방법만 다시 만들면 된다notify.

    의존성 주입과의 관계


    용어가 비슷해 섞기 쉽지만 의존적 반전의 원칙(DIP)과 의존적 주입(DI)은 다른 개념이다.
    의존성 주입(DI)은 해결 방안의 예에서 사용하는'NotificationManagernotifierinitialize에서 교부될 때'의 기술(즉 외부에서 의존 대상을 주입하는 것)을 말한다.
    문장으로 관계성을 나타내면 의존성 주입(DI)을 사용해 의존성 반전을 없앴다는 원칙(DIP) 위반으로 표현할 수 있다.

    참고 문헌

  • Rails를 통해 배우는 SOLID(5) 의존관계 역전의 원칙(번역)
  • 대상을 위한 설계 실천 지침
  • 좋은 웹페이지 즐겨찾기