1. PHP / Говнокод #3306

    +144

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    switch(true)
    {
     case tag1: /*тут обработка*/break;
     case tag2: /*тут обработка*/break;
     case tag3: /*тут обработка*/break;
     case tag4: /*тут обработка*/break;
    }

    Короче это был кусок парсера SGML файла, который в зависимости от встреченного тега выполнял действия. Этот код недословный, привожу чтоб показать как использовалась конструкция switch. На мой взгляд изящный подход =)

    Запостил: shurikroger, 25 Мая 2010

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

    • чёт это на ПХП мало похоже
      Ответить
    • это sax?
      Ответить
    • Почему? Если язык позволяет переменные в свитче, то почему бы и не сделать? Может быть непривычно если по сравнению с Java / C#, где можно либо константы, либо энумераторы, а вообще, вполне норм практика.
      Ответить
      • получается не оптимально по производительности
        Ответить
        • А в чем неоптимальность? Т.е. ситуация, когда именно так надо сделать это скорее всего тогда, когда констаны не получается использовать. Т.е. это просто другой способ записать кучу однотипных if-else. Просто кому как читать удобнее. В HaXe например, вполне нормальная практика делать что нибудь такое:
          enum Foo
          {
              Bar(f:Void->String);
              Bat(f:Void->Int);
          }
          . . .
          switch (value)
          {
              case Bar(value):
                  /* statements */
          
              case Bat(value):
                  /* statements */
          }

          Практически все парсеры чего угодно, которые я в нем видел используют что-то похожее.
          Ответить
          • здесь только один основной минус - несемантичность, со всеми вытекающими последствиями
            Ответить
      • switch (var) { case x: ... case y: ... } действительно может быть читаемее мотка if/elseif/else, особенно если там есть case'ы с кодом но без break'ов.

        Но switch(true) - бессмысленное удаление гланд через жопу.
        Ответить
        • switch (true)
          {
          	case (value == 1):
          	//
          	case (value == 2):
          	// . . .
          }

          Глупо потому что избыточно

          switch (true)
          {
          	case (func1() == funct2()):
          	//
          	case (func3() == func4()):
          	// . . .
          }

          Не вижу преступления. То же самое, что и кучу if-else написать. Скорость зависит от интерпретатора, но я сильно сомневаюсь, что вообще будет разница, а даже если будет, то на один-два опкода, выполняемые всего один раз... все равно, что лишнюю локальную переменную создать для удобства. В виртуальной машине AS1 / AS2, например, такой код скомпилировался бы идентично набору из if-else.
          Ответить
          • Вот только зачем писать изувеченый switch, когда можно написать нормальный if/else?
            switch (true)
            {
            	case (func1() == funct2()):
            	// ...
            	break;
            	case (func3() == func4()):
            	// . . .
            	break;
            }

            Против
            if (func1() == funct2()) {
            	// ...
            } else if (func3() == func4()) {
            	// ...
            }

            (Разве-что ради проваливающихся case'ов (без break'а, не знаю как это официально называется) с кодом)
            Ответить
            • Ну сами спросили, сами и ответили :)
              И мне вариант со свитчем легче читать. Так что - дело вкуса.
              Ответить
    • Вполне нормальный подход
      Ответить
    • Видел такое вроде даже в учебнике по пыху....
      меня такой подход устраевает - я примитивен (((
      Ответить
    • А что плохого то собственно? Обычная конструкция свитч, кейс.
      Ответить

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