여러 종류의 보상을 다루는 구조를 만들다가 실제로 몇 종류인지 세어 봤다.
Table of contents
Open Table of contents
일반적으로 만들고 있었다
무엇이든 보상이 될 수 있게 상위 클래스를 두고 종류별로 하나씩 만들었다. 코인과 아이템과 경험치와 버프 넷이었고 RewardType 과 클래스 넷을 만드는 데 하루가 걸렸다.
만들면서는 잘하고 있다고 생각했다. 나중에 종류가 늘어도 클래스 하나만 더하면 되는 구조이기 때문이다.
세어 보니 하나뿐이었다
기획이 준 CSV 에서 보상 종류를 awk 로 뽑아 세어 봤다.
$ awk -F',' '{print $3}' rewards.csv | sort | uniq -c
142 COIN
sort 로 묶고 uniq -c 로 세는 것이 전부였다. 결과는 전부 코인이었고 다른 종류가 하나도 없었다. 물어보니 나중에 아이템 보상도 넣을 수 있다는 답이 왔는데 언제인지는 정해진 것이 없었다.
되돌리니 한 줄이 됐다. 클래스 넷과 그것을 만드는 자리가 없어졌다. 나중에 필요할 수 있는 것과 지금 필요한 것은 다르다.
나중에 어려워지는지 봤다
되돌리기 전에 확인한 것이 있다. 나중에 종류가 늘 때 얼마나 걸리는지다.
다시 하루였다. 그런데 그 하루는 실제로 필요해졌을 때 쓴다. 지금 쓰는 하루는 필요한지도 모르는 것에 쓴다. 나중에 어려워지는 것과 나중에 하면 되는 것을 갈라야 했고 이건 뒤쪽이었다.
저장 형식의 차이
같은 눈으로 저장 형식을 보니 이건 달랐다. 코인 값만 저장하면 나중에 종류가 늘 때 형식을 바꿔야 한다. 이미 나간 앱의 저장 파일과 안 맞는다.
CCUserDefault::sharedUserDefault()
->setStringForKey("reward", "COIN:100");
setStringForKey() 에 종류를 같이 담아 자리를 뒀다. 코드는 나중에 늘려도 되지만 저장되는 것은 나중에 바꾸기 어렵다. 같은 판단을 코드와 저장에 똑같이 적용하면 한쪽이 틀린다.
여섯 달 뒤에 같은 awk 를 새 CSV 에 sort 와 함께 다시 돌려 보니 아이템 보상이 네 개 생겨 있었다. 그때 클래스를 만들었고 예상대로 하루가 걸렸다. 여섯 달을 안 쓰고 있었고 그동안 코드가 단순해서 다른 것을 고칠 때 편했다.
정리
- 만들기 전에
awk와uniq로 실제 종류를 센다. 한 줄이면 된다 - 나중에 필요할 수 있는 것과 지금 필요한 것은 다르다
- 나중에 어려워지는 것과 나중에 하면 되는 것을 가른다
- 코드는 나중에 늘려도 된다
setStringForKey()로 저장되는 형식은 미리 자리를 둔다- 같은 판단을 코드와 저장에 똑같이 적용하면 한쪽이 틀린다
- 몇 종류이고 몇 개이며 얼마나 늘 것 같은지를 확인한다
- 단순하게 둔 동안 다른 것을 고칠 때 편했다