블로그 이미지
지누구루

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2015. 2. 25. 15:24 공부

아직 생각이 완전히 정리된 내용은 아닙니다.

 

주된 내용은

'어떤 기능을 확장성 있게 만드려고 할때, 어디에 어떻게 기준을 두어야 할까?'

에 대한 고민입니다.

 

현재 일하고 있는 프로젝트에서,

최근에 만들고 있는 기능을 간략히 설명하고 고민하는 내용에 대해서 적어보겠습니다.

 

최근에 고민에 빠지게 한 내용

(사실 비슷한 고민은 굉장히 많이 하는데 그중 하나입니다)

 

RPG 게임이고

던전맵의 타입이 2가지(n가지라고 해도 좋음) 있습니다.

던전 타입에 따라서

  - 시작 방식

  - 진행 방식

  - 종료 방식

  - 몬스터 킬에 의한 보상

  - 게임 종료에 의한 보상

등등이 전부 다르게 적용될수도, 일부는 기존의 다른 던전 타입의 것을 그대로 사용할수도 있습니다.

 

덧) 물론 기획자가 저렇게 어떤 어떤 방식이 다르게 적용될 수 있다고 알려주지 않습니다.

      저렇게 구분하는건 저같은 경우는 보통은 프로그래머의 몫이었습니다.

 

여튼 새로 들어온 작업 내용이

"A타입의 맵에서는 플레이어가 사망할 경우, 경험치 하락이 있지만(레벨 하락은 X), B타입의 맵에서는 경험치 하락이 없게 해달라"

 

라는 내용이었습니다(아주 당연하지만 갑자기 들어온 작업이었지요).

 

현재는 모든맵에서 공통으로 "사망시 경험치 하락" 이 적용되고 있었기 때문에,

이걸 어떻게 작업을 할까... 하고 생각해 보았습니다.

 

 

업계에 들어온지 얼마 되지 않았던 시절의 저라면 고민하지 않고

if(mapType == A) 경험치하락();

else if(mapType == B) 아무짓도안함();

 

으로 if else 추가로 끝냈습니다.

 

그런데 이게, 이렇게 작업하다 보니, 새로운 맵의 타입이 추가되거나,

플레이어 사망시 페널티를 주는 종류가 늘어나는 경우,

점점 해당 코드는 if else 로 뒤덮히게 되고,

특정 맵에서 플레이어 사망시 실행되는 코드와 아닌코드,

그안에서 다시 조건이 들어가면서

(예를 들면 던전타입 A에서 솔로 플레이 시에는 플레이어 사망시 경험치를 하락시키지 않고,

  도움을 주는 NPC를 소환시켜준다. 같은 룰이 추가된다면?)

그래서 진짜로 실행되는 코드가 어느 코드야!! 알수가 없어!!

 같은 말도 안될거 같은 상황을 맛보게 되더란 말입니다.

 

그래서 현재 사용하는 방법중에 하나는.

모든 맵에서 공통으로 실행되는 플레이어 사망시 처리 함수(or 클래스)를 만들고,

던전 타입에 따라 실행되는 함수(or 클래스)를 매핑 시켜주는 방식입니다.

(실제로 사용하고 있는 코드는 구조가 다르지만 이런 방식이라고 이해해도 될것 같습니다)

 

이 경우, 던전 타입에 따라서 플레이어 사망 처리가 함수(or 클래스)별로 따로 나누어지기 때문에,

특정 던전타입에서 플레이어 사망 처리를 찾고, 확인하고, 작업하는데 큰 어려움이 없습니다.

 

하지만 이런 구조로 만드는 경우, .. 사실 한두 종류의 맵에서만 다르게 처리하면되는데,

모두가 override 하도록 강제되므로, 오히려 같은 코드의 복사가 일어날 가능성도 있습니다.

(물론 공통의 동작을 하는 클래스나 함수를 만들어놓고, default로 그녀석을 연결해두면 해결되긴 합니다)

 

 

그런데 여기서 또 고민이 시작되었습니다.

"사망 처리시 경험치 처리가 '맵'의 종류에 기반한 것이라면

그냥 사망 처리 함수에서

if( currentMap.getDiePenaltyType() == PENALTY_TYPE_EXP_DOWN )

과 같이 처리해야 하는 기능 별로 따로 만들수 있지 않을까?

하는 생각이 든겁니다.

 

 

경험치를 예로 들었지만,

예를 들어, "캐릭터 사망시 필요한 기능"을 기능별로 뺀 다음

1) 경험치 다운 기능

2) 도움을 주는 NPC를 소환하는 기능

3) 캐릭터가 사망한걸 친구들에게 알리는 기능

등등이 모두 조합 or 빼는게 가능하다고 한다면.

 

mapType 이 A인 map에

캐릭터 사망시 동작 기능에는 경험치 하락 기능만 build 해두고

mapType이 B인 map의

캐릭터 사망시 동작 기능에는 경험치 하락 기능을 넣지 않고,

다른 기능을 등록해 두어 자동으로 실행되게 하는 방법.

 

이 됩니다.

 

 

앞에서 설명했던 두 방법은 비슷해 보이지만,

관점에 따라서는 완전히 다르게 볼수도 있는 방법입니다.

이 글의 제목을 "확장의 기준" 이라고 쓴 이유는 이런 부분입니다.

 

1) 맵의 종류에 따라서 "캐릭터 사망시 처리"를 모두 분리 할 것이냐

2) 여기서 한단계가 더 확장 가능한, "캐릭터 사망시 처리를 build" 할 수 있게 할 것이냐

 

라는 부분입니다.

2)번의 기능으로 본다면

"경험치 하락" 이라는 아주 범용적인 기능을 만들어 두고,

경험치 하락이 필요한 모든 곳에서 해당 기능을 build 하여 사용할수 있게 됩니다.

 

 

현재 프로젝트에서는 1)번 형태로 되어 있는데,

점점 기능이 여기저기 붙고, 떨어지고, 제약이 다르다거나,

조건만 다르다거나, 하는 경우가 많아 지면서

2)번 형태의 기능 구현을 생각해보게 되었으나....

 

위에서도 말했다시피,

이런 기능 확장 / 변경이 매우 급박하게 치고 들어오는 형태가 되어 버리면...

이런 구조상의 변경은 손대기 어려워지고..(서비스 중이라면 더더욱)

어떤 부분이 어떻게 확장될지는 프로그래머가 스스로 판단하여 그 분기를 만들어야 하기 때문에,

처음부터 어떤 부분이 어떻게 확장될지를 추론하는것은 매우 어려웠습니다...

 

결론은 기능 확장의 기준을 정하는건 어렵더라....입니다.

......

죄송합니다.

끝.

(급마무리 되는 느낌이 들어더 어쩔수 없습니다...)

 

 

+ 한참 뒤에 다시 읽어 보니, 정말 글이 이상하게 되버렸네요;; 한번에 쓴 글이 아니고, 여러번에 나눠 쓰는 도중에 멘붕이 와서 대충 적어 버린거 같습니다. 쓰레기 같은 글이 되버렸지만, 일단 남겨둬 봅니다 ㅠㅠ

 

posted by 지누구루