단일 책임 원칙

단일 책임 원칙은 클래스가 변경해야 하는 이유는 단 하나여야 한다고 말합니다. 또한 각 클래스에는 하나의 작업만 있어야 하며 잘 수행해야 한다고 명시되어 있습니다.

A class should have one and only one reason to change.



이 원칙 뒤에 있는 이유는 책임이나 동작을 분리하여 디버깅과 리팩토링이 프로젝트의 다른 부분에 문제를 일으키지 않도록 하기 위함입니다.

학급이 이 원칙을 준수하는지 확인하는 좋은 방법은 학급이 가지고 있는 책임을 큰 소리로 말하는 것입니다. 모든 및 별도의 수업을 진행해야 합니다.

예시



직원에 대한 기본 CRUD 작업과 콘솔에 결과 로깅(👀)을 담당하는 클래스Employee Management가 있다고 가정해 보겠습니다. 이 클래스에는 직원을 배열로 푸시하는 함수와 작업 결과를 기록하는 함수가 있습니다. 코드는 다음과 같습니다.

//EmployeeManagement.js

class EmployeeManagement {
  constructor() {
    this.employees = [];
  }

  addEmployee(employee) {
    this.employees.push(employee);
    this.logResult('[LOG] EMPLOYEE ADDED');
  }

  logResult(message) {
    console.log(message);
  }
}


코드에 다음 변경 사항을 적용하라는 요청을 받았다고 가정해 보겠습니다.
  • 직원의 이름이 비어 있지 않도록 유효성 검사를 추가합니다.
  • 작업 결과를 콘솔이 아닌 파일에 기록합니다.

  • 변경 번호 1을 적용해 보겠습니다. 결과 코드는 다음과 같습니다.

    //EmployeeManagement.js
    
    class EmployeeManagement {
      constructor() {
        this.employees = [];
      }
    
      addEmployee(employee) {
        if (employee.name) {
          this.employees.push(employee);
          this.logResult('[LOG] EMPLOYEE ADDED');
        } else {
          this.logResult('[ERROR] NAME MUST NOT BE EMPTY');
        }
      }
    
      logResult(message) {
        console.log(message);
      }
    }
    


    직원의 이름이 비어 있지 않은지 확인하는 것은 여전히 ​​Employee Management 클래스에서 예상되는 동작입니다. 변경 이유는 직원 생성을 개선하기 위한 것이었습니다.

    이제 변경 사항 2를 적용해 보겠습니다. 결과 코드는 다음과 같습니다.

    //EmployeeManagement.js
    
    class EmployeeManagement {
      constructor() {
        this.employees = [];
      }
    
      addEmployee(employee) {
        if (employee.name) {
          this.employees.push(employee);
          this.logResult('[LOG] EMPLOYEE ADDED');
        } else {
          this.logResult('[ERROR] NAME MUST NOT BE EMPTY');
        }
      }
    
      logResult(message) {
        /*writeToFile is a mock function, just for educational purposes*/
        writeToFile(message);
      }
    }
    


    작업 결과를 파일에 기록하는 것은 Employees Management 와 관련된 동작이 아닙니다. CRUD 작업과 관련이 있습니까?

    지금쯤이면 Employee Management 클래스가 단일 책임 원칙에 위배되는 두 가지 변경 이유가 있음을 알 수 있습니다. 수업에서 무엇을 할 것인지 설명했을 때 "그리고"👀를 사용했다는 사실을 눈치채셨나요?

    Let's say we have an Employee Management class that's responsible for basic CRUD operations over Employees and Logging the results on the console.



    원칙을 적용하려면 별도의 logResult 클래스에 Logger 함수가 있어야 결과를 기록하는 방법을 변경하려는 경우 자체 별도의 클래스에 있어야 합니다. 클래스의 리팩토링은 다음과 같아야 합니다.

    //EmployeeManagement.js
    
    class EmployeeManagement {
      constructor() {
        this.employees = [];
        this.logger = new Logger();
      }
    
      addEmployee(employee) {
        if (employee.name) {
          this.employees.push(employee);
          this.logger.logResult('[LOG] EMPLOYEE ADDED');
        } else {
          this.logger.logResult('[ERROR] NAME MUST NOT BE EMPTY');
        }
      }
    }
    
    //Logger.js
    class Logger {
      logResult(message) {
        /*writeToFile is a mock function, just for educational purposes*/
        writeToFile(message);
      }
    }
    


    각 클래스가 변경해야 하는 이유는 단 하나뿐임을 기억하십시오. 새 코드를 사용하여 직원을 추가하는 방식이나 작업 결과를 기록하는 방식을 변경하려는 경우 단일 책임 원칙에 따라 별도의 클래스에서 변경할 수 있습니다.

    좋은 웹페이지 즐겨찾기