반응형
단일 책임 원칙(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들을 로드 및 저장 기능을 만들어 관리할 수 있습니다.

반응형

+ Recent posts