스크립트 프로그래밍 프로그래밍에서 가장 골치를 썩이는 문제 중 하나는

존재하지 않는 것을 사용하는 것 입니다.

물론 스크립트가 가지고 있는 강력한 예외 처리 기능을 사용하면
예외를 무시하고 넘어갈 수도 있습니다.


하지만... -_-

예를 들어 허드에 HP 와 MP 게이지를 갖고 있는 작은 상태창을 가지고 있다고 생각해봅시다.

허드를 로드하면
작은 상태창이 생기고
HP 값이나 MP값을 설정할 수 있게 됩니다.


hud.Load()
hud.miniStatus.SetCurHp(10)


잘 돌아가는 코드이죠 ~(-_-)~

그런데 어느날 인터페이스 작업자가 실수로 인터페이스 정의 xml 에 오타를 냈습니다.
이로 인해 hud.Load 호출시 예외가 발생합니다.


hud.Load() # 로딩 실패 예외 발생!
hud.miniStatus.SetCurHp(10)


예외 처리를 해볼까요?


try:
hud.Load() # 로딩 실패 예외 발생!
except:
pass # 로딩 실패 예외 땜방 해결
hud.miniStatus.SetCurHp(10) # 그러나...!


다시 실행을 해보지만 여전히 문제가 발생합니다.
바로 hud.miniStatus 때문입니다.

단순한 해결책은 다음과 같습니다.


hud.miniStatus = None
try:
hud.Load() # 로딩 실패 예외 발생!
except:
pass # 로딩 실패 예외 땜방 해결
if hud.miniStatus: # 잘 로딩 되었을까?
hud.miniStatus.SetCurHp(10)


문제는 해결되었지만... 귀찮은 일이 생겼습니다.

hud.miniStatus 를 접근하는 모든 코드

일일이 hud.miniStatus 가
존재하는지 확
해야한다는 것입니다.


아악 -_-)> 이렇게되면

스크립트 언어를 써야할 이유가 없잖아!



그렇습니다.

스크립트를 사용하는 이유는 마음 편히 빨리 개발하자는 건데

변수가 있을지 없을지 조마조마해야 한다면 스크립트 언어를 써야할 의미가 반감됩니다.

그렇다고 대비를 안하면 작업하는 사람이 불안불안 할겁니다,

프로그래머가 아니라면 어디에서 에러난지 찾아내는 것도 일이거든요.


이런 문제를 해결하기 위해 필요한 것이 바로 더미입니다!


hud.miniStatus = Dummy("mini_status")
hud.Load() # 예외 실패시 그냥 리턴됨
hud.miniStatus.SetCurHp(10)


더미란 위와 같은 상황에서 그냥 mini_status.SetCurHp(10) 이란 메시지가 뜨게 만들어주는 것입니다.

C++ 로 더미를 구현하기란 어렵지만 스크립트 언어라면 간단합니다 ~(-_-)~


class Dummy:
VERBOSE = True

def _log(self, msg):
print(msg)

def __init__(self, name, pname = None):
self.name = name
self.pname = pname

def __getattr__(self, attrName):
return Dummy(attrName, self.__str__())

def __call__(self, *args, **kwargs):
if self.VERBOSE: self._log("%s.%s%s" % (self.pname, self.name, args))

def __str__(self):
return ".".join((self.pname, self.name)) if self.pname else self.name

def __repr__(self):
return "dummy(%s)" % (self.__str__())


짜잔 ~(-_-)~

사용 예를 한번 보겠습니다.

a = Dummy("test")
print a
print a.b
a.b.c()


결과
test
test.b
test.b.c()

a 는 b라는게 없지만 불구하고 c메소드가 있는것처럼 호출됩니다.

실제 사용하기 위해서는 몇가지 더 고려할 사항이 있습니다만,
일단 더미를 소개하는 차원으로 간단하게 작성해보았습니다

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/23 08:40 2009/04/23 08:40
Tag ,