단일 책임 원칙 - Javascript의 SOLID 원칙

이것은 SOLID 설계 원칙을 다루는 기사 시리즈의 첫 번째 기사입니다.

SOLID 디자인 원칙은 무엇입니까?



SOLID는 이해하기 쉽고 유지 관리 가능한 코드를 작성할 수 있도록 하는 일련의 객체 지향 설계 원칙입니다. 코드의 한 부분을 변경해도 다른 부분에 영향을 미치지 않도록 합니다. SOLID는 5가지 주요 설계 원칙의 약어입니다.
  • S - 단일 책임 원칙
  • O - 개폐 원칙
  • L - Liskov 대체 원리
  • I - 인터페이스 분리 원리
  • D - 종속성 반전 원칙

  • 이 시리즈에서는 이 5가지 원칙을 모두 다룰 것입니다. 이 기사의 첫 번째 항목을 다룰 것입니다.

    단일 책임 원칙



    단일 책임 원칙(Single Responsibility Principle)은 클래스가 하나의 책임만 가져야 한다는 것은 변경해야 할 이유가 하나만 있어야 함을 의미합니다. 즉, 하나의 작업만 있어야 합니다.
    클래스에 여러 책임이 있는 경우 단일 책임을 위반하지 않도록 여러 클래스로 분할하는 것이 좋습니다.

    예시



    학생과 코스를 관리하는 애플리케이션을 구축하고 있다고 가정해 보겠습니다.

    순진한 솔루션



    다음과 같은 클래스가 있을 수 있습니다.

    class Student {
      constructor(name) {
        this.name = name;
        this.courses = [];
      }
    
      enrollCourse(course) {
        this.courses.push(course);
        this.notify(course);
      }
    
      notify(course) {
        console.log(`${this.name}, you have successfully enrolled ${course}.`);
      }
    }
    
    const Shahmir = new Student("Shahmir");
    Shahmir.enrollCourse("Physics");
    
    // Output
    // Shahmir, you have successfully enrolled Physics.
    


    여기에는 2개의 속성, 학생의 이름 및 코스가 있습니다. 그런 다음 과정을 추가하기 위한 함수 registeredCourse가 해당 과정에 대해 학생에게 알리기 위해 알림 기능을 사용합니다.
    이제 해결책이 좋아 보이지 않습니까? 그러나 단일 책임 원칙을 위반하고 있습니다.

    단일 책임을 위반하는 이유는 무엇입니까?



    위의 예를 주의 깊게 살펴보면 두 가지 책임이 있습니다.
  • 등록 과정
  • 새로 등록한 과정에 대해 학생에게 알리기

  • 클래스를 변경해야 하는 두 가지 이유가 있습니다.
  • 과정 등록 방법을 변경하려는 경우
  • 사용자에게 알리는 방법을 변경하려는 경우

  • 알림 기능의 문제점은 다음과 같습니다.
  • 콘솔에 메시지를 인쇄하는 대신 학생에게 알리기 위해 이메일이나 푸시 알림을 보내려면 어떻게 해야 합니까? 돌아와서 클래스를 변경해야 합니다.
  • 10개의 서로 다른 클래스가 있고 그 안에 알림 기능이 있으면 어떻게 합니까? 함수를 10번 작성해야 합니다.
  • 기능을 다시 변경하려면 어떻게 해야 합니까? 우리는 10곳의 다른 곳에서 변화를 주어야 합니다.

  • 더 나은 솔루션



    왜 그 기능을 클래스에서 빼지 않습니까? 이렇게 하면 클래스가 단일 책임 원칙을 사용하고 원하는 곳 어디에서나 해당 기능을 사용할 수 있습니다. 그리고 변경을 원할 때마다 다른 부분에 영향을 주지 않고 코드의 한 부분만 변경합니다.

    function notify(message) {
      console.log(message);
      // we can also email or send a push notification
    }
    
    class Student {
      constructor(name) {
        this.name = name;
        this.courses = [];
      }
    
      enrollCourse(course) {
        this.courses.push(course);
        notify(`${this.name}, you have successfully enrolled ${course}.`);
      }
    }
    
    const Shahmir = new Student("Shahmir");
    Shahmir.enrollCourse("Physics");
    
    // Output
    // Shahmir, you have successfully enrolled Physics.
    


    이제 수업에는 단 하나의 책임이 있으며 그것은 과정을 등록하는 것입니다. 알림 기능은 클래스와 별개입니다.
    그게 다야. 개방 폐쇄 원칙을 다루는 다음 기사에서 뵙겠습니다.

    나를 팔로우하세요:

    Github

    좋은 웹페이지 즐겨찾기