Jawa / Говнокод #20123 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 moonson, (Updated )

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

    • Оптимально сначала выбирать один символ, чтобы лишний раз не сравнивать всю строку:
      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. А кто подаёт на вход данные с заведомо несуществующими тегами, тот сам себе злобный Буратино.
          Ответить
  • А в С# без break/throw/return/goto case/бесконечного цикла не скомпилируется. *trollface?*
    Ответить
  • В Java такой же свитч со сквозным задним проходом, как в Си? Т. е. при отсутствии брейка выполнится вся стопка последующих команд?
    Ответить
  • Я сначала подумал что фишка в том, что 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);
        }
        }
        }
        }
        }
        Ответить
  • --а зачем тут двойная проверка?
    --без нее не работало...
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8