1. Java / Говнокод #20123

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    XmlPullParser xpp = ...
    
    xpp.nextTag();
    
    switch (xpp.getName()) {
        case "airport":
            if (xpp.getName().equals("airport")) {
                parseAirport(xpp, place);
            }
        case "border":
            if (xpp.getName().equals("border")) {
                parsePlaceBorder(xpp, place);
            }
        case "trainStation":
            if (xpp.getName().equals("trainStation")) {
                parseTrainStation(xpp, place);
            }
        default:
            break;
    }

    "Блин, че-то свитч не работает, что за хрень, сделаю-ка я дополнительную проверку внутри для надежности"

    Запостил: moonson, 02 Июня 2016

    Комментарии (25) RSS

    • Надо было делать else-if'ы, чтобы оптимально.
      Ответить
      • Оптимально сначала выбирать один символ, чтобы лишний раз не сравнивать всю строку:
        switch (xpp.getName().charAt(0)) {
            case "a":
                if (xpp.getName().equals("airport")) {
                    parseAirport(xpp, place);
                }
                break;
            case "b":
                if (xpp.getName().equals("border")) {
                    parsePlaceBorder(xpp, place);
                }
                break;
            case "t":
                if (xpp.getName().equals("trainStation")) {
                    parseTrainStation(xpp, place);
                }
                break;
            default:
        }

        Если на какую-нибудь букву будет слишком много слов, то алгоритм можно продлить, сделав вложенный свитч по второму символу. И так далее.
        Ответить
        • Зачем проверять другие символы? getName() видимо возвращает enum
          Ответить
          • Действительно. Будем считать, что на входе данные соответствуют формату и какой-нибудь тег trash будем приравнивать к тегу trainStation. А кто подаёт на вход данные с заведомо несуществующими тегами, тот сам себе злобный Буратино.
            Ответить
        • switch со строками в жаве работает как хеш-таблица
          Ответить
          • И, вроде как, каждый такой свищ компилится в отдельный класс...
            Ответить
            • Нет, там тупо захардкоженая хеш-таблица в ифах и кейсах
              Ответить
              • Со скольких вариантов хэш-таблица генериться? Не дольше ли получится?
                Ответить
    • А в С# без break/throw/return/goto case/бесконечного цикла не скомпилируется. *trollface?*
      Ответить
    • В Java такой же свитч со сквозным задним проходом, как в Си? Т. е. при отсутствии брейка выполнится вся стопка последующих команд?
      Ответить
      • Да. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
        Ответить
        • Ну вот он и починил, потому что без ифов всё насквозь проваливалось. Кстати, в первом кейсе можно убрать иф.
          Ответить
    • Я сначала подумал что фишка в том, что Java в свиче сравнивает строки через ==
      Ответить
    • А между тем, значение xpp.getName() может измениться.
      Это же метод. Не исключено, что с побочными действиями. Не исключено, что многопоточность.

      А, ну да. Тут всё проще. тут типа "оптимизация". Байтоёбство, короче. К тому же бессмысленное и беспощадное с точки зрения оптимизации. Ибо сравнение строк выдаёт false на сравнении первого символа в случае, если они не равны.
      Ответить
      • Извините. По большей части в лужу пёрнул. Про байтоёбство это к комменту inkanus-gray.
        Ответить
        • А я возьму и соглашусь с каждым словом. Тут нужен либо только свитч (с брейком в каждой ветке), либо только иф-элс (но тогда нужно закешировать вызов метода). Гибрид здесь и вправду не нужен.
          Ответить
      • > многопоточность
        Тогда у меня для тебя плохие новости...

        З.Ы. Автор просто про break не знал, а вы тут каких-то ужасов навыдумывали ;)
        Ответить
        • Вообще да: если там многопоточность, то метод может вернуть другое значение между 7 и 8 строками. Может получиться ненадежно. Я бы еще проверку сделал чтобы уж точно

          if (xpp.getName().equals("airport")) {
           if (xpp.getName().equals("airport")) {
           if (xpp.getName().equals("airport")) {
           if (xpp.getName().equals("airport")) {
                      parseAirport(xpp, place);
          }
          }
          }
          }
          }
          Ответить
    • --а зачем тут двойная проверка?
      --без нее не работало...
      Ответить
    • опять на говнораше было задание?
      Ответить

    Добавить комментарий