Skip to content
isdnetworks
Go back

설계가 전제한 것이 없었다

랭킹을 실시간으로 보여 주기로 했다. 만들다 보니 서버에 그런 것을 줄 수 있는 자리가 없었다.

Table of contents

Open Table of contents

만들 것부터 정했다

화면을 먼저 그렸다. CCLayer 위에 상위 목록을 얹고 아래에 내 순위를 붙이는 형태다.

내 순위를 보여 주려면 전체에서 몇 번째인지 알아야 한다. 서버에 물어보니 ORDER BY 로 정렬해 LIMIT 100 까지만 준다고 했다. 300위대인 사람은 그 안에 없으니 순위를 못 보여 준다.

전제를 안 확인하고 시작했다

화면을 그릴 때 순위를 알 수 있다는 것을 전제했다. 그게 되는지는 안 물어봤다. 만드는 데 나흘을 쓰고 나서 알았는데 처음에 물어봤으면 30분이었다.

만들기 전에 필요한 것을 목록으로 만들었어야 했다. 상위 목록과 내 점수는 있는 것이다. 내 전체 순위와 갱신 주기는 물음표였다. 물음표가 있는 것부터 물어보는 순서다.

없는 것을 어떻게 할지 정했다

세 가지가 있었다. 서버에 만들어 달라고 하면 시간이 걸리고 언제 되는지 모른다. 없이 되는 화면으로 바꾸면 지금 만들 수 있다.

세 번째로 클라이언트 계산도 봤는데 안 됐다. 순위를 내려면 전체를 받아야 하는데 그럴 양이 아니었다. 쓰던 cocos2d-x 판에는 HTTP 클라이언트조차 없어서 libcurl 을 얹어 쓰고 있었고 JSON 을 받아 파싱하는 것도 직접 붙인 것이었다.

두 번째로 하면서 첫 번째를 같이 요청했다. 지금 있는 것으로 되는 화면을 만들고 순위가 생기면 그때 바꾼다. 기다리는 동안 아무것도 안 나가는 것보다 낫다.

바꿀 자리와 요청 형식

나중에 바꿀 것을 아니까 그 자리를 순수 가상 클래스로 떼어 놨다.

class RankProvider {
public:
    virtual bool getMyRank(int& outRank) = 0;
};

화면은 RankProvider 만 보므로 구현을 갈아 끼워도 안 고친다. getMyRank() 가 거짓을 돌려주면 순위 자리를 비운다. 왜 이렇게 돼 있는지도 주석으로 적었다. 이유 없이 못 보여 준다는 상태만 있으면 다음 사람이 다시 조사한다.

같은 전제를 깐 화면이 더 있는지도 봤다. 주간 랭킹은 주간 점수를 서버가 안 갖고 있었다. 지난주 순위는 보관을 안 하고 있었다. 셋 중 둘이 안 되는 것이었는데 만들기 전에 알았다.

요청할 때는 없으면 어떻게 되는지까지 적어서 보냈다. 필요한 주소와 응답 JSON 형태와 쓰는 자리와 호출 빈도를 함께 넣으니 답이 빨리 왔다.

정리


Share this post on:

Previous Post
리소스 파일명이 규칙이었다
Next Post
코드 하나로 두 플랫폼을 낸다고 했다