반응형
단일 책임 원칙(SRP)
"클래스는 단 한개의 책임을 가져야 한다"를 의미하는 간단한 규칙입니다.
즉, 클래스가 1차적인 책임을 져야 하고 다른 책임을 떠맡지 않아야 합니다.
클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에
클래스가 한 개의 이유로만 변경되려면 클래스는 한 개의 책임만을 가져야한다고 합니다.
이러한 이유로 이 원칙의 다른 말로 "클래스를 변경하려는 이유는 단 한 개여야한다."고도 표현합니다.
C/C++예제
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Journal
{
public:
string title;
vector<string> entries;
explicit Journal(const string& title):
title{ title }
{
}
void Add(const string& entry);
void Save(const string& filename); // Save : 단일 책임 원칙에 벗어남.
};
void Journal::Add(const string& entry)
{
static int count = 1;
entries.emplace_back(to_string(count++) + ": " + entry);
}
void Journal::Save(const string& filename)
{
ofstream ofs(filename);
for (auto& s : entries)
ofs << s << endl;
}
class PersistenceManager
{
public:
static void Save(const Journal& j, const string& filename)
{
ofstream ofs(filename);
for (auto& s : j.entries)
ofs << s << endl;
}
};
void main()
{
Journal journal{ "Dear Diary" };
journal.Add("I ate a bug");
journal.Add("I cried today");
//journal.save("diary.txt");
PersistenceManager pm;
pm.Save(journal, "diary.txt");
}
예제로 단일 책임 원칙을 살펴보겠습니다.
Journal 이란 클래스에서 제목과 내용들을 가지고 있고 이것에 대한 책임만을 가져야합니다.
그래서 만약 Jounal 내부에 로드 및 저장 기능을 추가한다면 단일 책임 원칙을 벗어나게 됩니다.
즉, 문제점은 Journal 내부에 로드 및 저장 기능을 추가하는 것입니다.
이유는 Journal 외에도 항목을 유지하고 추가하고 수정할 수 있어야하기 때문입니다.
그리고 이러한 Journal을 로드 및 저장하기 위하여 지속성이 필요한데, 이러한 기능들을 관리 할 수 있는
별도의 클래스가 필요하게 됩니다.
그래서 만든 것이 PersistenceManager 입니다.
이 PersistenceManager 로 여러 Journal들을 로드 및 저장 기능을 만들어 관리할 수 있습니다.
반응형
'Etc > Design Pattern' 카테고리의 다른 글
리스코프 치환 원칙(Liskov Substitution Principle) (0) | 2021.12.07 |
---|---|
개방-폐쇄 원칙(Open/Closed Principle) (0) | 2021.12.06 |
객체 지향 설계(SOLID) (0) | 2021.11.26 |