단일 책임 원칙
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);
}
}
코드에 다음 변경 사항을 적용하라는 요청을 받았다고 가정해 보겠습니다.
//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);
}
}
각 클래스가 변경해야 하는 이유는 단 하나뿐임을 기억하십시오. 새 코드를 사용하여 직원을 추가하는 방식이나 작업 결과를 기록하는 방식을 변경하려는 경우 단일 책임 원칙에 따라 별도의 클래스에서 변경할 수 있습니다.
Reference
이 문제에 관하여(단일 책임 원칙), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/josuerodriguez98/single-responsibility-principle-5h09텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)