builder 패턴?과 관련된 질문드립니다.(C++)
글쓴이: shi510 / 작성시간: 월, 2018/07/16 - 11:12오후
(제목이 부적절한 것 같아서 수정했습니다. 찾아보니 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. 이러한 목적을 위한 다른 방법이 있을까요?(아키텍처 디자인 같은 것들)
Forums:
...
뭔가 방향이 거꾸로 된 것 같은데요. 제가 알기로는 보통 두 가지 흔히 쓰이는 방법이 있는데,
(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()를 부르게 됨.
보통 이런 방식이 흔히 쓰이는 걸로 알고 있습니다.
답변감사합니다.
제가 엄청 큰 프로젝트를 혼자 진행하고 있는데요.
핵심 알고리즘은 다 구현하고나서 API 설계 하는 중에 상호참조가 발생하더라구요..
그래서 알려주신 내용이랑 Forward Declaration 방법 사용해서 문제점 전부 해결했습니다.
원하는 설계 모양대로 진행이 되어서 기분이 너무 좋네요.
댓글 달기