Use Strict String Key Map

일반적으로 Parameter 전달은 가끔씩 고민을 하게 만드는 문제입니다.

parameter[String key] = value 방식은 간단하고 다수의 파라패터를 쉽게 넘길 수 있습니다.

그러나 String 의 특성상, 오타를 내면 바로 바로 오동작을 일으키게 만드는 원인이 될 수 있습니다.

그런데, 조금만 생각을 추가하면, 넣을 수 있는 ‘Key’를 제한 한다면 어떨까요?

아주 간단하게 Key Name 을 제한해서 이미 허용해둔 값들만 Set 할 수 있도록 만들면 간단하지 않을까요?

물론, 허용 Key Name을 추가할 수 있도록 만들어 두고, 테스트 코드에서 한번씩 확인하게 해주면,

의외로 간단하면서, 실수하기 쉬운 파라매터나 Conf 설정을 쉽게 할 수 있을듯 합니다.

다음은 위에 말한 기법을 이용한 python singleton 예제입니다.

 class Parameter(object):
    key_list = [ 'name', 'price', 'size' ]

    def init(self):
        self.m_param_keyword = {}
        self.m_param_dict = {}

        for key in self.key_list:
            self.add_allow_key( key )

    def get_keys(self):
        return self.m_param_dict.keys()

    def get_allow_keys(self):
        return self.m_param_keyword.keys()

    def add_allow_key(self, key):
        self.m_param_keyword[ key.lower() ] = True

    def add_allow_keys( self, keys ):
        for key in keys:
            self.add_allow_key( key )

    def is_valid_key( self, key ):
        if self.m_param_keyword.get(key, False) == True:
            return True

        return False

    def __init__(self):
        self.init()

    def set( self, key, value):
        lower_key = key.lower()
        if self.is_valid_key( lower_key ) == False:
            return False

        self.m_param_dict[lower_key] = value
        return True

    def get( self, key ):
        return self.m_param_dic[key]

if __name__ == '__main__':
    paramter = Parameter()

    print parameter.set( 'name', 'charsyam' )
    print parameter.set( 'price2', 10 )

    parameter.add_allow_keys( ['inventory'] )
    print parameter.get_allow_keys()

    print id(conf1), id(conf2)