한 줄 요약하면, 하나의 class를 수정할 이유는 단 하나뿐이어야 한다.
로 요약할 수 있다.
구체적인 설명을 위하여 아래 예제의 Employee
class를 잘 살펴보자.
아래 Employee
class는 2가지 역할을 하고 있는 것으로 볼 수 있는데, 하나는 salary_
, schedule_
과 같은 (1)정보를 관리하는 것, 다른 하나는 관리하고 있는 (2)정보들을 출력하는 것이다.
따라서, (1)관리하는 정보가 추가/삭제/변경될 때 또는 (2)출력해야하는 정보의 포맷(행정 서식으로 이해하자)이 바뀔 때 2가지 이유에 의해 Employee
class가 수정될 여지가 있다.
class Employee
{
private:
Salary salary_;
Schedule schedule_;
public:
void printSalary() const;
void printSchedule() const;
};
반면, 아래와 같이 출력해야할 각 정보에 따라서 출력 기능을 별도의 class로 분리해 준다면, 보다 Single Responsibility에 부합하는 설계가 된다.
아래의 구현에서는 직원에 대해 관리할 정보가 추가/삭제/변경될 때는 Employee
class를, 출력할 서식이 바뀔 때는 해당하는 *Printer
class를 수정해주면 된다.
class Employee
{
private:
Salary salary_;
Schedule schedule_;
};
class SalaryPrinter
{
public:
static void Print(const Salary& salary);
};
class SchedulePrinter
{
public:
static void Print(const Schedule& salary);
};