KoreanFoodie's Study

디자인 패턴 (GOF) #1 - Single Responsibility Principle (단일 책임 원칙) 본문

Game Dev/Design Patterns

디자인 패턴 (GOF) #1 - Single Responsibility Principle (단일 책임 원칙)

GoldGiver 2022. 6. 7. 15:39

GoF 의 디자인 패턴강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다.

Single Responsibility Principle (단일 책임 원칙)

Single Responsibility Principle, 줄여서 SRP 는 단일 책임 원칙으로, 모든 클래스가 하나의 책임을 가지며, 클래스가 그 책임을 완전히 캡슐화해야 함을 의미한다.

아래 코드를 보자.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <boost/lexical_cast.hpp>
using namespace std;

struct Journal
{
  string title;
  vector<string> entries;

  explicit Journal(const string& title)
    : title{title}
  {
  }

  void add(const string& entry);

  // persistence is a separate concern
  void save(const string& filename);
};

void Journal::add(const string& entry)
{
  static int count = 1;
  entries.push_back(boost::lexical_cast<string>(count++)
    + ": " + entry);
}

void Journal::save(const string& filename)
{
  ofstream ofs(filename);
  for (auto& s : entries)
    ofs << s << endl;
}

struct PersistenceManager
{
  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 은 Diary 에 내용을 추가하는 기능을 수행한다. 그런데 만약 Journal 클래스 안에 내용을 txt 파일에 저장하는 기능을 또 만드는 것은 SRP 를 위배할 수 있다.

따라서 이 경우, PersistenceManager 구조체를 이용해 파일을 저장하는 기능을 분리하는 것이 좋다.

 

Comments