이 포스트를 남긴 목적

  • 객체 팩토리를 라이브러리로 만들기 위해, 일반화 시키는 과정을 기록하기 위해

이 포스트의 준비물

  • g++, make, vim + proejct, msvc
  • firefox 4 b8
  • vmplayer, debian, putty, ssh

참조 코드

  • loki library - Factory class
  • boost::factory

참조 문헌

  • 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
    Addiston-Wesley. 인포북. 초판 2003.07.30. Chapter8 page(337 ~ 343)

  • 비야네 스트롭스트룹 저. The C++ Programming Language. 곽용재 역.
    Addiston-Wesley. (주)피어슨에듀케이션코리아. 초판 2쇄 2006.02.20. 14장 예외처리 참조

  • 스콧 마이어스 저. Effective STL. 곽용재 편역
    Addison-Wesley. 인포북. 초판 2002.01.14. Item 23 참조

내용

일반화 시키려면, 먼저 어떤 기능(정책)들이 필요한지 생각해야 한다. 객체 팩토리는 다음과 같은 기능(정책)들이 필요하다.

  • 실제 객체를 생성할 수 있는 호출 가능한 객체
    - 팩토리가 생성할 객체를 실제로 생성해 줄수 있는 함수/함수자가 필요하다.

  • 객체를 고르게 해주는 ID(식별자)
    - 예제에선 전부 int 를 썼으나, enum 타입 또는 정렬 가능한 어떠한 타입을 이용할 수 있다.

  • 에러
    - 원하는 객체를 팩토리가 생성할수 없을 경우, 대처 방법이 정책에 따라 NULL, 예외를 나타낼 수 있다.

이렇게 정리 되었는데, 여기엔 한가지 정책이 더 필요할 수 있다. loki library - Factory class 에는 여기에 한가지 정책을 더 추가해, 호출 가능한 객체(함수/함수자)의 파라미터 정책도 가지고 있다. 하지만 이 부분은 정리하는데 있어 걸림돌(실제로 템플릿 메타프로그램을 거쳐야 하는 부분이 있어, 정리가 어렵다)이므로 제거하고 정리한다.

에러에 대한 정책은 나중에 추가하기로 하고, 먼저 생성 정책, 아이디 정책 부터 구현한다.

첫번째 맛보기 코드

첫번째 맛보기 코드 해석

  • 템플릿으로 먼저 객체의 생성, 아이디 타입을 템플릿을 뽑았다.
    - 기존 animal_factory 와 별차이 없다.

첫번째 맛보기 코드의 단점

  • 객체 생성 호출 객체가 함수로 굳어졌다.
    - 때론 함수자가 필요할 수 있는 부분이기 때문에, 좋지 못하다. 이 부분을 함수자까지 포함해야 된다.

두번째 맛보기 코드 - 첫번째 코드 단점 해결

두번째 맛보기 코드 해석

  • 함수와 함수자를 다 받아주기 위해서, boost::function 을 이용했다. :)
    - 나중에 인자를 받아 생성하는 함수/함수자가 필요할 때는 boost::bind 와 묶으면 된다.

  • 아직 에러를 처리하는 정책이 없다.
    - 요구된 객체를 생성할 수 없을 경우, NULL 을 리턴할 지, 예외를 던질지, 아무 객체나 넘겨 줄지 결정할수 있어야 한다.

세번째 맛보기 코드 - 에러 정책 추가

세번째 맛보기 코드 해석

  • 예외 정책을 추가 했고, 찾지 못한 타입일 경우, null, 또는 exception 을 발생하도록 한다.

테스트 맛보기 코드

여담

  • 로키 라이브러리에선 함수맵을 std::map 을 쓰지 않고, 정렬 vector 를 이용했다.
    - 정렬 vector는 고정된 크기에선 map 보다 더 빠른 속도를 낸다.

  • boost::factory, boost::value_factory가 있다.
    - 코드는 몇줄 안되는데, 이해는 힘들다. :)

  • Loki 라이브러리를 기준으로 설명된 것이기 때문에, Loki 라이브러리를 보는것도 좋다.

  • clone factory 개념도 있는데, 이는 생략한다.

:wq

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기