Волшебный номер MVN на коммутаторе

Я некоторое время имел дело с Checkstyle и знаю, что такое магические числа, однако я никогда не сталкивался с этим таким образом, это просто переключатель для назначения данных, но случаи отмечены как магические числа, и я не могу сделать их окончательными или ничего подобного (что я знаю). Созданная мной программа получает случайное число (целое от 0 до 199) и использует его в переключателе, не только это, но и 200 в ra.nextInt(200); тоже "волшебство".

Мои вопросы: как мне предотвратить превращение случаев в магические числа без необходимости объявлять 200 новых переменных?

Это мой код:

public Basura selectB(final Basura b) {

        private Random ra = new Random();

        ran = ra.nextInt(200);

        switch (ran) {
            case 0: b.setName("Funko Roto");
                b.setClasification("PL"); break;
            case 1: b.setName("Bateria de Laptop");
                b.setClasification("B"); break;
            case 2: b.setName("Sobras de Comida");
                b.setClasification("O"); break;
            case 3: b.setName("Clips de Oficina");
                b.setClasification("M"); break;
            case 4: b.setName("Colcha Deshilachada");
                b.setClasification("T"); break;
            case 5: b.setName("Disco DVD");
                b.setClasification("B"); break;

             ...

            default:b.setName("ERROR");
                b.setClasification("E"); break;
        }

        return b;
    }

person Francisco de la torre    schedule 14.04.2020    source источник
comment
stackoverflow.com/questions/15539435/ I это уже читал, но не особо помогло   -  person Francisco de la torre    schedule 14.04.2020
comment
Как я могу решить ошибку магического числа в случае x?   -  person Francisco de la torre    schedule 14.04.2020
comment
Отредактировал вопрос   -  person Francisco de la torre    schedule 15.04.2020


Ответы (2)


Вы можете преобразовать этот список в текстовый файл и заставить программу считать содержимое файла в массив. Вы можете поместить его в жестко запрограммированное место в коде или настроить местоположение, или вы можете поместить его в путь к классам (src/main/resources, если вы используете соглашения maven) и прочитать его с помощью Class.getResourceAsStream.

Сохраните классификацию в той же строке, что и имя, разделив их разделителем, например:

Sobras de Comida|O
Colcha Deshilachada|T

и т. д. Длина массива — это значение, которое передается в nextInt.

Содержимое файла загружается в массив. Избавьтесь от переключателя и используйте случайное значение для индексации массива, чтобы получить свою строку. Затем вы можете разделить строку и установить поля в возвращаемом вами pojo.

При таком подходе:

  • Волшебных чисел не бывает.

  • Список проще обновить.

  • Вы можете удалить кучу повторяющегося малозначительного кода.

person Nathan Hughes    schedule 14.04.2020

Я попробовал предложенный ответ, и он сработал, вот код, который я получил

public class DBAnalisis {


        private Random ra = new Random();

        private int ran = 0;

        private final int doscientos = 200;


    public Basura selectB(final Basura b) throws IOException {

        ran = ra.nextInt(doscientos);


        String linea;


        String[] basu = new String[2];


        BufferedReader dataBse = null;


        ArrayList<String> list = new ArrayList<String>();


        URL direcc = getClass().getResource("DB.txt");
        FileReader dB =
                new FileReader(direcc.getPath());

                try {

                    dataBse = new BufferedReader(dB);
                    // Lectura del fichero
                    while ((linea = dataBse.readLine()) != null) {
                        list.add(linea);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                dB.close();

                String[] myArray = new String[list.size()];
                list.toArray(myArray);


                //basu = myArray[ran].split("|", 1); no funciona

                 int index = myArray[ran].indexOf("|");
                 basu[0] = myArray[ran].substring(0, index);
                 basu[1] = myArray[ran].substring(index + 1);
                 basu[0].trim();
                 basu[1].trim();

                 b.setName(basu[0]);
                 b.setClasification(basu[1]);

                return b;


    }
}

DB.txt — это файл, который содержит каждую строку, которая была в переключателе. Он разделен следующим образом: ИМЯ|КЛАСС

person Francisco de la torre    schedule 16.04.2020