게임/마인크래프트 앱 개발일기

마인크래프트 가이드 앱 개발기 2편 "왠 Python?"

Lou Park 2016. 6. 21. 08:46

오랜만에 2편을 써본다. 아무도 안기다렸지만 ㅎㅎㅎㅎ '~'

방학을 맞아서 유저들에게 약속했던 7월 대규모 업데이트를 하려 다시 안드로이드 스튜디오를 켰다.

그동안 코딩스타일을 배워 한 층 더 업그레이드 된 눈으로 다시 코드를 보니 엉망이었다.

앱 특성상 아이템을 추가할 일이 많은데, 아이템 추가하기가 번거롭고 힘들게 되어있었다.

그래서! 더욱 편하게 아이템을 추가하기 위해 나에게 조금 더 나은 인터페이스를 제공하기로 했다.


리팩토링

이전에는 아이템을 추가하려면 layout에서 아이템 아이콘을 추가하고, 개별 아이템마다 onclick="아이템이름"다는

작업을 한 뒤에, 아이템 정보가 담겨있는  ItemDB를 모아놓은 ArrayList<ItemDB>인 ItemDBList에도 정보를 업데이트 해야 했다.

그러나 아이템이 300개가 넘다보니 속도도 느려지고 한 번 작업하기 여간 까다로운 일이 아니다.

그래서 LayoutInflater, addView() 기능을 이용해 동적으로 뷰를 생성하는 쪽으로 리팩토링 방향을 잡았다.



처음에 한 두시간은 동적 뷰에 모든 시간을 할애 한 듯하다~

ㅎㅎ 포기할까~도 생각했지만 편안한 미래를 위해서 참았다.



변경전 Activity.java 파일은 무려 2297줄이다.

말하기도...부끄럽다 ㅎㅎ;

아이템 300개를 일일이 다 findViewId 시켜서 (그나마 ButterKnife 썼지만)

일일이 OnClickListener를 붙여주었었다.


그러나 변경 후는 어떨까? 아직 OnClickListener를 붙여주진 않았지만

123줄로 무려...20배나 코드 절약을 했다.


텍스트 수정엔, Python!

이 Activity.java 리팩토링의 뒤에는 ItemDBList와 ItemDB의 수정이 있었다.

ItemDB의 멤버 변수와 생성자를 수정함으로서 ItemDB 자체에 Category를 분류하는 기능이 생겼다.

그러면서 ItemDBList도 포맷을 변환해야 할 일이 생긴 것이다.

그래서 이번에는 Python을 이용하기로 했다. Python의 강력하고 간단한 기능이라면

코드 몇줄 만으로 텍스트를 바꾸는 일을 처리할 수 있을 것 같아서였다.

결과는? 정답정답!! Python 은 내 몇 시간의 수고를 덜어주었다. 자주 애용해야지 'v'



이것은 대략 변경 전 ItemDBList의 상태 ^^ 저 한줄한줄 모두를 바꾸려니 ㅎㅎ;

파이썬 없었으면 동생 돈주고 시킬뻔했다. 사람이 하면 실수가 많지만...


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# writedata.py
# reference
armorWords = ["chestplate""leggings""helmet""mask""boots""armor""head"]
weaponWords = ["sword""bow""shield""arrow"];
resourceWords = ["ingot""ore""emerald"];
toolWords = ["axe""shovel""nametag""book""map""stand""clock""hoe"]
transportWords = ["cart""rail"];
mechaWords = ["trap""command""door""weight"]
foodWords = ["fish""steak""pork""egg""potato""raw""cook""seed""carrot""soup""cake""pie""watermelon"]
dyeWords = ["dye""bonemeal""rose""flower""cyan""magenta""orange""inksac"]
 
= open("C:/Users/jizard/Desktop/code.txt""r")
f2 = open("code_after.txt""w")
while True:
    line = f.readline()
    if not line: break
    words = line.split("R.string.")
    word = words[2].split(",");
    keyword = word[0];
    # for categorize
    type = "BLOCK"
    for i in armorWords :
        if keyword.find(i) != -1 :
            type = "ARMOR";
            break;
    for i in weaponWords:
        if keyword.find(i) != -1:
            type = "WEAPON";
            break;
    for i in resourceWords:
        if keyword.find(i) != -1:
            type = "RESOURCE";
            break;
    for i in toolWords:
        if keyword.find(i) != -1:
            type = "TOOL";
            break;
    for i in transportWords:
        if keyword.find(i) != -1:
            type = "TRANSPORTATION";
            break;
    for i in foodWords:
        if keyword.find(i) != -1:
            type = "FOOD";
            break;
    for i in mechaWords:
        if keyword.find(i) != -1:
            type = "MECHANISM";
            break;
    for i in dyeWords:
        if keyword.find(i) != -1:
            type = "DYE";
            break;
    code = "add(new ItemDB(ItemDB.Category." + type + ", \"" + keyword + "\", context));\n"
    f2.write(code)
f.close()
cs


하지만 위와 같은 파이썬 코드로 한 번에 아래와 같이 정리할 수 있었다.

아이템에 특정 단어가 들어가면 카테고리 정리도 할 수 있게 해서 더욱 유용했다!

자주 자주 애용해야겠다.