builder 패턴?과 관련된 질문드립니다.(C++)

shi510의 이미지

(제목이 부적절한 것 같아서 수정했습니다. 찾아보니 builder 패턴과 유사한 것 같네요.)
이러한 방법의 용어가 있는지 모르겠습니다.
우선 제가 설명할 간단한 예제 코드 보여드리겠습니다.

//foo.h
 
class Bar; // declared other file.
 
class Foo{
public:
    const std::vector<int> GetNums(){
        return nums;
    }
 
private:
    friend class Bar;
    std::vector<int> nums;
};

//bar.h
#include "foo.h"
 
class Bar{
public:
    Bar(Foo *foo);
 
    void AddNums(int num);
 
private:
    const Foo *foo;
};

//bar.cc
#include "bar.h"
 
void Bar::Bar(Foo *foo) : foo(foo){}
 
void Bar::AddNums(int num){
    foo->nums.push_back(num);
}

이러한 짓거리?를 하는 이유를 설명드리자면...
Foo class는 외부에 보여지기에 담겨진 정보만 보여지는 것을 원합니다.
Foo class의 private 변수의 변경은 Bar class가 담당합니다.
(또는 유저가 write할 수 있는 최소한의 함수만 public하는 경우, 나머지는 Bar class가 담당)

Bar class는 내부적으로 사용하는 class라서 유저 API측에서는 보여질 필요가 없음.
따라서 foo.h 파일에는 Bar class를 위한 friend 키워드만 필요함으로 bar.h에 대한 header include는 필요 없음

추가로 조금더 설명드리자면... FooBuilder라는 class가 있는데
FooBuilder class는 Bar class를 사용하여 Foo class를 완성하고 최종적으로 완성된 Foo class를 반환하는 상황입니다.

질문의 요지는 다음과 같습니다.
1, 이러한 코드 형태를 사용했던 경험이 있는지 궁금합니다.(다른 개발자님들의 경험 공유차원에서..)
2. 이러한 목적을 위한 다른 방법이 있을까요?(아키텍처 디자인 같은 것들)

jick의 이미지

뭔가 방향이 거꾸로 된 것 같은데요. 제가 알기로는 보통 두 가지 흔히 쓰이는 방법이 있는데,

(1) Foo라는 abstract base class가 있고 FooImpl이라는 derived class가 있음. 사용자는 builder 함수를 호출해서 FooImpl 객체를 Foo *로 받게 됨. Foo에서는 사용자가 부를 필요가 있는 함수만 API로 제공하고 구체적인 구현은 FooImpl에 들어있음.

(2) Foo라는 함수에서 FooImpl을 가리키는 smart pointer를 들고 있음. Foo의 객체 a가 있을 때 사용자가 a.func()를 부르면 내부적으로 impl->func()를 부르게 됨.

보통 이런 방식이 흔히 쓰이는 걸로 알고 있습니다.

shi510의 이미지

제가 엄청 큰 프로젝트를 혼자 진행하고 있는데요.
핵심 알고리즘은 다 구현하고나서 API 설계 하는 중에 상호참조가 발생하더라구요..
그래서 알려주신 내용이랑 Forward Declaration 방법 사용해서 문제점 전부 해결했습니다.
원하는 설계 모양대로 진행이 되어서 기분이 너무 좋네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.