Skip to content
isdnetworks
Go back

단계마다 자료 형태가 바뀌고 있었다

Cocos2d-x 로 만든 상점 화면에서 아이템 가격이 이상하게 나왔다. 서버가 보낸 값과 화면에 뜨는 값이 달랐다. 어디서 바뀌는지 찾는 데 오래 걸렸다.

Table of contents

Open Table of contents

거치는 단계가 넷이었다

값이 화면에 닿기까지 네 단계를 지났다. JsonCpp 로 읽은 Json::ValueShopItemRaw 로 옮긴다. 그것을 ShopItem 으로 옮기고 마지막에 표시용 문자열로 만든다.

우리가 쓰는 판에는 JSON 을 읽는 것이 안 들어 있어서 JsonCpp 를 따로 넣어 썼다.

raw.price = json["price"].asInt();                    // 1
item.price = raw.price * (100 - raw.discount) / 100;  // 2
sprintf(buf, "%d", item.price / 100);                 // 3

세 번째에서 100 으로 나누고 있었다. 서버가 원 단위로 보내는데 화면은 100 원 단위로 보여 준다는 약속이었다. 문제는 그 약속이 어디에도 적혀 있지 않았다는 것이다.

asInt() 도 한 번 걸렸다. 서버가 가격을 "12000" 처럼 따옴표에 넣어 보낸 날이 있었는데 그때 예외가 났다. isInt() 로 먼저 보고 아니면 asString() 을 거치게 했다.

단계별로 값을 찍어 봤다

각 단계에서 값을 CCLOG 로 남겼다.

1. json=12000
2. raw=12000
3. item=10800
4. display=108

3 번에서 할인이 붙고 4 번에서 나눈다는 것이 한 줄로 보였다. 그 전에는 .cpp 를 위아래로 오가며 읽고 있었다. 값이 여러 단계를 지날 때는 코드를 읽는 것보다 단계마다 찍어 보는 쪽이 빨랐다.

바뀌는 지점을 적었다

각 단계에서 무엇이 바뀌는지 주석으로 남겼다.

// ShopItemRaw: 서버 응답 그대로. price 는 원 단위, discount 는 0~100 정수
// ShopItem:    할인 적용 후. price 는 원 단위
// 표시:        price / 100. 상점 UI 는 100원 단위로 보여 준다

적어 두니 다음에 볼 때 어느 단계를 봐야 하는지 바로 안다. 단위가 바뀌는 지점은 코드를 봐도 안 드러나서 이런 것은 적는 수밖에 없다.

단계 줄이기와 이름에 단위 넣기

넷 중 하나는 없어도 됐다. ShopItemRawShopItem 이 거의 같고 필드 하나만 달랐다. 합치면서 원가와 할인가를 둘 다 들고 있게 했다. 그러니 화면에서 둘을 나란히 보여 줄 수도 있게 됐다. 중간 형태를 하나 없애니 어긋날 지점도 하나 줄었다.

이름에 단위도 넣었다. 값 하나가 원 단위인지 100원 단위인지 이름으로는 알 수 없었다.

int priceWon;         // 원
int priceDisplay;     // 화면 표시용 (100원 단위)

시간 값도 같은 문제였다. remainMs 처럼 밀리초임을 이름에 넣었다. 이름에 단위가 있으면 잘못 쓰기 어렵다.

표시용 sprintf 가 상점과 인벤토리와 결과 화면에 흩어져 있었다. 그것도 한 함수로 모았다. 나중에 천 단위 쉼표를 넣게 됐을 때 한 곳만 고쳤다.

정리


Share this post on:

Previous Post
한쪽은 층이 있고 한쪽은 평평했다
Next Post
배포는 됐는데 아무것도 안 바뀌었다