"PHP" / Говнокод #3306 Ссылка на оригинал

0

  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 shurikroger, (Updated )

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

  • Почему? Если язык позволяет переменные в свитче, то почему бы и не сделать? Может быть непривычно если по сравнению с 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'а, не знаю как это официально называется) с кодом)
          Ответить
          • Ну сами спросили, сами и ответили 🙂
            И мне вариант со свитчем легче читать. Так что - дело вкуса.
            Ответить
  • Видел такое вроде даже в учебнике по пыху....
    меня такой подход устраевает - я примитивен (((
    Ответить
  • А что плохого то собственно? Обычная конструкция свитч, кейс.
    Ответить

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

Помни, guest, за тобой могут следить!

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


    8