본문 바로가기

개발 Note/UI Framework 개발하기

key - value 관리

반응형

key 값과 value 로 data를 관리하는 형태는 상당히 편리하고 유용한 기법입니다.

최근 iCloud에서 이런 key /value 관리 기법을 사용하여  내가 구입한 책 정보, 현재 읽고있는 책의 북마크 , Contact 정보 등을 
관리하고 보관 update 한다고 스티브 잡스 님이 예기 하여 약간 화제가 되고 있는 기술입니다.

우선 iOS 의 경우에는 Objective-C의 언어 적인 특징으로 key-value 기능 지원이 자연스럽게 구축되어있는 상황이라고 보여집니다.  (NSResponsible, NSObject , NSProxy 정보에 기술되어있습니다.)


key-Value 컨셉을 C++에서 비슷한 성격의 클래스를 만들수 있지 않을까 해서 ,  디자인/ 구현 해보고자 아래와 같이 구상했습니다.

우리가 class를 설계 할때 대부분 class의 기능을 생각하고, 필요한 속성을 찾고 이를 멤버변수로 정하고, 멤버변수에 접근하는 API를 설계해서 추가한다.
그러면 아래와 같은 형태가됩니다.

class TitleBox
{
...
public:
   void SeBounds(int x,int y,int w,int h);
   void GetBounds(int *x,int *y,int *w,int*h);
   void SetBgColor(RGB col);
   void GetBgColor(RGB * col);
   void SetText(string &text);
   string &GetText();
   
protected:
  string m_Text;
  Rectangle m_Bounds;
  RGB m_bgColor;
};

이렇게 설계가 되고 나면, 그다음에 이 class를 사용해서 뭔가를 만들기 시작하는데,
한참 모듈을 만들다 보면 "아 Text Color 도 변경이 되어야 겠네!!" 하게 됩니다.

그래서 Text Color를 변경하는 API를 추가하고, 멤버 변수도 추가하죠.

그리고 한참 작업하다보면, Icon 추가하는 기능도 필요하게 되고, 
BgColor 대신 bg image를 사용하고 싶어질때도 있고, 그때 마다 API를 추가하거나 변경하고,
해당 API를 사용하는 모든 곳을 찾아서 다시 수정해야 합니다.

또... 멤버 변수의 종류가 점점 늘어나면 늘어날 수록 API 개수는 거의 2배정도로 늘어나게 되고, 
이를 관리하는 것도 힘들어지게 되죠.

그래서 개발자들은 이를 획기적으로 개선할 수 있는 방법들을 하나 둘씩 생각하기 시작합니다.

그래서 control의 속성을 나타내는 멤버 변수들을 묶는 컨셉이 나오게 됩니다.
이를 attribute 나 property 라는 이름으로 설명하곤하는데요. property라고 하겠습니다.

그러면서 property의 내용을 속성마다 일일히 멤버 변수를 정의 하는 것이 아니라,
STL의 map 과 같이 key와 value 로 관리하는 방법을 취하게 됩니다.

property.set("bounds.x",10);
property.set("bounds.y",10);
property.set("bounds.w",10);
property.set("bounds.h",10);
property.set("bg.color",RGB(100,210,113));
property.set("bg.image","user/bg_ship.jpg");

property.get("bounds.x",&cx);


이런 형태를 취하게 됩니다.

이로 인해서 class의 확장이나 기능 변경시에 API의 변경 폭이 줄어들게 되어, 유지 보수에 매우 효과적인 결과를 나타내게 됩니다.

이와 더불어 부가적인 효과로 control을 조작할때 더이상 해당 control의 class를 알 필요가 없어지게 되었습니다.
단순한 기능의 경우 property만 parameter로 넘겨받아서 property의 속성값을 확인하면 되기 때문에 모듈간의 dependency가 줄어들게 된 것입니다.

[Button.h]----------------------------
class Button
{
 void SetText();
};
--------------------------------------


[ButtonUI.c]--------------------------

#include "Button.h"

class ButtonUI
{
protected:
   Button * m_pButton;   //<--- 이와 같이 실제로 Button class를 알아야만 조작이 가능해 집니다.
public:
   void ChangeText();
};

ButtonUI::ChangeText()
{
    m_pButton->SetText();
}
--------------------------------------
그런데 만약 Property를 이용하게 된다면,
ButtonUI는 더이상 Button class를 알 필요가 없어지고, Property 만 control로 부터 얻어올 수 있으면 property만 조작하는 것이 가능해 집니다.

이는 class factory 형식을 이용하여, class의 instance를 생성해주는 모듈과 함께 사용된다면,
class간의 의존성을 획기적으로 줄일 수 있게 됩니다.

그리고 data를 접근하는 기법이 통일되어 여러가지 형태로 활용이 가능해 지게 됩니다.


XML이나 script같은 engine을 활용하여 property를 조작하는 부가적인 기능도 만들 수 있게되고,
property만 따로 registry에 저장하여 , 현재 상태를 임시로 저장했다가 다시 실행할때 동일한 형태로 불러오는 것도 가능해집니다.