Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Повторное использования кода (https://forum.zone-game.info/showthread.php?t=23087)

halaymoon 22.09.2012 20:13

Повторное использования кода
 
Здравствуйте товарищи. Начал изучать потихоньку яву и читать одну книжечку.
Приступил к написанию простейшего класса (для l2j), который будет выполнять функции аннонса локаций. И вот столкнулся с дилеммами. Я просто стал понимать что мой код противоречит понятиям ООП, в нем куча повторного использования кода, а это просто приводит в ужас. Пожалуйста обьясните мне идиоту, как можно сделать "иначе" этот блок кода, что бы не использовать так много повторяющихся частей, или вообще упростить максимально выборку:

Код:

//значит есть поле:

private static final int[] MapIDS =
{
      1,2,3,4,5,6,7,8,9,10,11,12
};

//метод, который получает рандом значения отсюда:

private static int getRandMapID()
{
return MapIDS[Rnd.get(MapIDS.length)];
}

//переменные для хранения имен локаций

private static String LocNameFirst = "Empty";
private static String LocNameSecond = "Empty";
private static String LocNameThird = "Empty";
private static String LocNameFourth = "Empty";

//методы для получения ID локации

public static int getFirstLocation(){return LocOne;}
public static int getSecondLocation(){return LocTwo;}
public static int getThirdLocation(){return LocThr;}
public static int getFourthLocation(){return LocFou;}

//по умолчанию они:

public static int LocOne = 0;
public static int LocTwo = 0;
public static int LocThr = 0;
public static int LocFou = 0;

//и отсюда примерно начинается быдло-код:

public String getLocNameFirst()
        {
                switch(getFirstLocation()){
                        case 1: LocNameFirst = "The Enchanted Valley"; break;
                        case 2: LocNameFirst = "Fellemere Lake"; break;
                        case 3: LocNameFirst = "Iris Lake"; break;
                        case 4: LocNameFirst = "Dragon Valley"; break;
                        case 5: LocNameFirst = "Hardins Academy"; break;
                        case 6: LocNameFirst = "Arizona"; break;
                        case 7: LocNameFirst = "Ancient Battleground"; break;
                        case 8: LocNameFirst = "Forsaken Plains"; break;
                        case 9: LocNameFirst = "Alligator Island"; break;
                        case 10: LocNameFirst = "Valley of Saints"; break;
                        case 11: LocNameFirst = "Execution Grounds"; break;
                        case 12: LocNameFirst = "Blazing Swamp"; break;
                        case 13: LocNameFirst = "Cruma Marshlands"; break;
                        case 14: LocNameFirst = "Sea of Spores"; break;
                        case 15: LocNameFirst = "Swampland"; break;
                        case 16: LocNameFirst = "Lair of Antharas"; break;
                        case 17: LocNameFirst = "Den of Evil"; break;
                        case 18: LocNameFirst = "Ketra Orc Outpost"; break;
                        case 19: LocNameFirst = "Frozen Labyrinth"; break;
                        case 20: LocNameFirst = "Ivory Tower"; break;
                        case 21: LocNameFirst = "Ruins of Despair"; break;
                        case 22: LocNameFirst = "Hot Springs"; break;
                        case 23: LocNameFirst = "Dark Omens"; break;
                        case 24: LocNameFirst = "Field of Whispers"; break;}
                return LocNameFirst;
        }
        public String getLocNameSecond()
        {
                switch(getSecondLocation()){
                        case 1: LocNameSecond = "The Enchanted Valley"; break;
                        case 2: LocNameSecond = "Fellemere Lake"; break;
                        case 3: LocNameSecond = "Iris Lake"; break;
                        case 4: LocNameSecond = "Dragon Valley"; break;
                        case 5: LocNameSecond = "Hardins Academy"; break;
                        case 6: LocNameSecond = "Arizona"; break;
                        case 7: LocNameSecond = "Ancient Battleground"; break;
                        case 8: LocNameSecond = "Forsaken Plains"; break;
                        case 9: LocNameSecond = "Alligator Island"; break;
                        case 10: LocNameSecond = "Valley of Saints"; break;
                        case 11: LocNameSecond = "Execution Grounds"; break;
                        case 12: LocNameSecond = "Blazing Swamp"; break;
                        case 13: LocNameSecond = "Cruma Marshlands"; break;
                        case 14: LocNameSecond = "Sea of Spores"; break;
                        case 15: LocNameSecond = "Swampland"; break;
                        case 16: LocNameSecond = "Lair of Antharas"; break;
                        case 17: LocNameSecond = "Den of Evil"; break;
                        case 18: LocNameSecond = "Ketra Orc Outpost"; break;
                        case 19: LocNameSecond = "Frozen Labyrinth"; break;
                        case 20: LocNameSecond = "Ivory Tower"; break;
                        case 21: LocNameSecond = "Ruins of Despair"; break;
                        case 22: LocNameSecond = "Hot Springs"; break;
                        case 23: LocNameSecond = "Dark Omens"; break;
                        case 24: LocNameSecond = "Field of Whispers"; break;}
                return LocNameSecond;
        }
        public String getLocNameThird()
        {
                switch(getThirdLocation()){
                        case 1: LocNameThird = "The Enchanted Valley"; break;
                        case 2: LocNameThird = "Fellemere Lake"; break;
                        case 3: LocNameThird = "Iris Lake"; break;
                        case 4: LocNameThird = "Dragon Valley"; break;
                        case 5: LocNameThird = "Hardins Academy"; break;
                        case 6: LocNameThird = "Arizona"; break;
                        case 7: LocNameThird = "Ancient Battleground"; break;
                        case 8: LocNameThird = "Forsaken Plains"; break;
                        case 9: LocNameThird = "Alligator Island"; break;
                        case 10: LocNameThird = "Valley of Saints"; break;
                        case 11: LocNameThird = "Execution Grounds"; break;
                        case 12: LocNameThird = "Blazing Swamp"; break;
                        case 13: LocNameThird = "Cruma Marshlands"; break;
                        case 14: LocNameThird = "Sea of Spores"; break;
                        case 15: LocNameThird = "Swampland"; break;
                        case 16: LocNameThird = "Lair of Antharas"; break;
                        case 17: LocNameThird = "Den of Evil"; break;
                        case 18: LocNameThird = "Ketra Orc Outpost"; break;
                        case 19: LocNameThird = "Frozen Labyrinth"; break;
                        case 20: LocNameThird = "Ivory Tower"; break;
                        case 21: LocNameThird = "Ruins of Despair"; break;
                        case 22: LocNameThird = "Hot Springs"; break;
                        case 23: LocNameThird = "Dark Omens"; break;
                        case 24: LocNameThird = "Field of Whispers"; break;}
                return LocNameThird;
        }
        public String getLocNameFourth()
        {
                switch(getFourthLocation()){
                        case 1: LocNameFourth = "The Enchanted Valley"; break;
                        case 2: LocNameFourth = "Fellemere Lake"; break;
                        case 3: LocNameFourth = "Iris Lake"; break;
                        case 4: LocNameFourth = "Dragon Valley"; break;
                        case 5: LocNameFourth = "Hardins Academy"; break;
                        case 6: LocNameFourth = "Arizona"; break;
                        case 7: LocNameFourth = "Ancient Battleground"; break;
                        case 8: LocNameFourth = "Forsaken Plains"; break;
                        case 9: LocNameFourth = "Alligator Island"; break;
                        case 10: LocNameFourth = "Valley of Saints"; break;
                        case 11: LocNameFourth = "Execution Grounds"; break;
                        case 12: LocNameFourth = "Blazing Swamp"; break;
                        case 13: LocNameFourth = "Cruma Marshlands"; break;
                        case 14: LocNameFourth = "Sea of Spores"; break;
                        case 15: LocNameFourth = "Swampland"; break;
                        case 16: LocNameFourth = "Lair of Antharas"; break;
                        case 17: LocNameFourth = "Den of Evil"; break;
                        case 18: LocNameFourth = "Ketra Orc Outpost"; break;
                        case 19: LocNameFourth = "Frozen Labyrinth"; break;
                        case 20: LocNameFourth = "Ivory Tower"; break;
                        case 21: LocNameFourth = "Ruins of Despair"; break;
                        case 22: LocNameFourth = "Hot Springs"; break;
                        case 23: LocNameFourth = "Dark Omens"; break;
                        case 24: LocNameFourth = "Field of Whispers"; break;}
                return LocNameFourth;
        }

Т.Е. в продолжении кода там используется чтото вроде: Если локация равна ID 1, то ее имя TheEnchantedValley, и тд. Айди равно соответсвующему названию по списку.
Может быть есть более адекватные способы, которыми можно засунуть и имя и айди в один массив, или еще что -нибудь? Обьясните плз.

Как видим, во всех случаях мне нужно приравнять имя локации к одним и тем же именам, меняются только LocID (LocOne, LocTwo...etc). Долго думал как сделать иначе, но безрезультатно.

Вроде бы по логике все верно, и главное работает.. Но чувствую что такой подход очень глуп. Обьясните как сделать правильно. Я ищу и искал подобные участки кода, но потерялся в безысходности.(

pchayka 22.09.2012 20:26

Re: Повторное использования кода
 
Ну обычно такие данные засовывают в статические файлы типа xml и оттуда читают

halaymoon 22.09.2012 20:52

Re: Повторное использования кода
 
Цитата:

Ну обычно такие данные засовывают в статические файлы типа xml и оттуда читают
Это если данных действительно много. Но у меня данных не так много(всего 24), я думаю вполне адекватно все же сделать все внутри класса)

shocked 22.09.2012 23:06

Re: Повторное использования кода
 
Вынеси свич в отдельный метод, передавай int туда и получай название , кода в 2 раза меньше будет. А вообще учи джава http://forum.zone-game.info/showthread.php?t=1188, особенно колекции, мапы и тд

pchayka 23.09.2012 11:09

Re: Повторное использования кода
 
Цитата:

Это если данных действительно много. Но у меня данных не так много(всего 24), я думаю вполне адекватно все же сделать все внутри класса)
Хранить конкретные данные внутри кода, хранить статические данные в sql, хранить динамические данные в статических файлах - это все дурной тон.


Текущее время: 18:05. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot