Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 19:41
Оценка: +1 :)))
Надоело писать длинные else if.
Сало Украине, Героям Сала
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 19:43
Оценка:
Ведь единственная задача switch(value) будет посчитать хеш строки, а хеш для case можно рассчитать при компиляции.
Сало Украине, Героям Сала
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: Privalov  
Дата: 14.03.12 19:45
Оценка:
Здравствуйте, vpchelko, Вы писали:

V>Надоело писать длинные else if.


Так не надо длинные. Загони все, что нужно, в таблицы, всего делов.
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 19:47
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Так не надо длинные. Загони все, что нужно, в таблицы, всего делов.


Так для свича компилятор сам строит таблицу, почему это не сделать для строк?
Сало Украине, Героям Сала
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: mymuss  
Дата: 14.03.12 19:48
Оценка: 1 (1)
Здравствуйте, vpchelko, Вы писали:

V>Надоело писать длинные else if.


В Java 7 есть
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: aloch Россия  
Дата: 14.03.12 19:50
Оценка: 1 (1) +1 :))) :))
В C появились строки?


Re[3]: Почему в С/JAVA нет поддержки switch/case для строк?
От: Privalov  
Дата: 14.03.12 20:00
Оценка:
Здравствуйте, vpchelko, Вы писали:

V>Так для свича компилятор сам строит таблицу, почему это не сделать для строк?


Потому что длинные switch/case — ужасны. А если еще кто-нибудь начнет вложенные switch писать — вообще труба. У меня к ним отвращение возниклло после того, как я парочку WndProc-ов на голом WinAPI нафигачил. А с таблицами все просто. Если функционал какой добавить надо, просто добавляешь элементы в таблицу. Весь остальной код не изменяется. switch я использую только в первой версии того, что пищу, той, которая в конечном итоге выбрасывается в мусор.
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 20:00
Оценка:
Здравствуйте, aloch, Вы писали:

Нету конечно. Я два плюса забыл дописать, но это уже не исправить
Сало Украине, Героям Сала
Re[4]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 20:04
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Потому что длинные switch/case — ужасны. А если еще кто-нибудь начнет вложенные switch писать — вообще труба. У меня к ним отвращение возниклло после того, как я парочку WndProc-ов на голом WinAPI нафигачил. А с таблицами все просто. Если функционал какой добавить надо, просто добавляешь элементы в таблицу. Весь остальной код не изменяется. switch я использую только в первой версии того, что пищу, той, которая в конечном итоге выбрасывается в мусор.


За вложенные свичи надо бить по лицу.
Но, а свичь по enum — это стандартный подход.

Во точно в JAVA есть поддержка строковых enum, я как то это упустил при создании темы.
Сало Украине, Героям Сала
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 20:18
Оценка:
Здравствуйте, mymuss, Вы писали:

M>В Java 7 есть


Да, только что проверил, NetBeans предлагает 7 жаву, только вот я не могу с пивом разобраться как создать проект на 7 жаве.
Сало Украине, Героям Сала
Re[3]: Почему в С/JAVA нет поддержки switch/case для строк?
От: aloch Россия  
Дата: 14.03.12 20:20
Оценка: +2
Здравствуйте, vpchelko, Вы писали:

Если в C строк нет, то в C++ их слишком много std::string, CString (MFC/ATL), QString и еще сотнявелосипедов. Кого должен поддержать компилятор? std::string? но я его вообще не использую (с скорее всего использовать уже никогда не буду). В какой кодировке? Так что можно сказать, что в C++ строк то же нет. Вот в C#/Java строки есть и с ними все понятно. И никому в голову не придет писать саой строковый велосипед на C#.

Я до сих пор не понимаю, на кой черт в первых реализациях C++ сделали мало кому (на мой взгляд) нужные iostreams.h и не сделали всем нужных стандартных строк (самых элементарных, но которые могли послужить общей базой для всех) и простеньких соллекций (типа CMap/CArray/CList из первой версии MFC)? После чего в каждом компиляторе C++ появлялся свой несовместимый вилосипед — один к MS, другой у Borland и так далее....


Re[5]: Почему в С/JAVA нет поддержки switch/case для строк?
От: aloch Россия  
Дата: 14.03.12 20:22
Оценка: +1 :))
Здравствуйте, vpchelko, Вы писали:

V>За вложенные свичи надо бить по лицу.


Дяденька, а вложденный if делать можно?


Re[5]: Почему в С/JAVA нет поддержки switch/case для строк?
От: Privalov  
Дата: 14.03.12 20:27
Оценка: -2 :)
Здравствуйте, vpchelko, Вы писали:

V>За вложенные свичи надо бить по лицу.


С этим согласен.

V>Но, а свичь по enum — это стандартный подход.


Когда-то switch по сообщениям Винды, а внутри него switch по типу какого-нибудь WM_COMMAND тоже считался стандартными подходом. Оставим вложенный, с ним разобрались. Код со switch — это код write only. Он слишком труден для модификации, методы со switch всегда чересчур длинные. Нет, все-таки таблицы рулят.
Re[6]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 20:37
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Когда-то switch по сообщениям Винды, а внутри него switch по типу какого-нибудь WM_COMMAND тоже считался стандартными подходом. Оставим вложенный, с ним разобрались. Код со switch — это код write only. Он слишком труден для модификации, методы со switch всегда чересчур длинные. Нет, все-таки таблицы рулят.


Почему труден, как по очень даже прост. Да и свич эта та же таблица. Просто она пишется на месте.
Сало Украине, Героям Сала
Re[6]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 14.03.12 20:39
Оценка:
Здравствуйте, aloch, Вы писали:

A>Дяденька, а вложденный if делать можно?


Речь о свиче, что вложенный свыч лучше в отделенную функцию положить.
Сало Украине, Героям Сала
Re[4]: Почему в С/JAVA нет поддержки switch/case для строк?
От: Mamut Швеция http://dmitriid.com
Дата: 14.03.12 21:13
Оценка:
A>Я до сих пор не понимаю, на кой черт в первых реализациях C++ сделали мало кому (на мой взгляд) нужные iostreams.h и не сделали всем нужных стандартных строк (самых элементарных, но которые могли послужить общей базой для всех) и простеньких соллекций (типа CMap/CArray/CList из первой версии MFC)? После чего в каждом компиляторе C++ появлялся свой несовместимый вилосипед — один к MS, другой у Borland и так далее....

Ну, когда С++ только появился, он продолжал быть достаточно легким враппером над ассемблером, а строки тогда всегда были просто потоками байт, и ASCII хватало с головой. Проавда, почему они не появились к 1998-му году, когда уже было понятно, что так жить нельзя — непонятно


dmitriid.comGitHubLinkedIn
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: B0FEE664  
Дата: 14.03.12 22:47
Оценка: :))
Здравствуйте, vpchelko, Вы писали:

V>Надоело писать длинные else if.


В С не только switch/case для строк нет, там нет даже такого "простого" случая:

f(int x, int y, int z)
{
  switch(8)
  {
    case x:
      ...
    break;

    case y:
      ...
    break;

    case z:
      ...
    break;
  }
...
}
И каждый день — без права на ошибку...
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
От: vpchelko  
Дата: 15.03.12 00:47
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, vpchelko, Вы писали:


V>>Надоело писать длинные else if.


BFE>В С не только switch/case для строк нет, там нет даже такого "простого" случая:


BFE>
BFE>f(int x, int y, int z)
BFE>{
BFE>  switch(8)
BFE>  {
BFE>    case x:
BFE>      ...
BFE>    break;

BFE>    case y:
BFE>      ...
BFE>    break;

BFE>    case z:
BFE>      ...
BFE>    break;
BFE>  }
BFE>...
BFE>}
BFE>


о_О
Сало Украине, Героям Сала
Re: Почему в С/JAVA нет поддержки switch/case для строк?
От: Deprivator  
Дата: 15.03.12 05:35
Оценка:
Здравствуйте, vpchelko, Вы писали:

V>Надоело писать длинные else if.


чтобы программеры С# больше любили
In P=NP we trust.
Re[7]: Почему в С/JAVA нет поддержки switch/case для строк?
От: Privalov  
Дата: 15.03.12 06:39
Оценка: :))
Здравствуйте, vpchelko, Вы писали:

V>Почему труден, как по очень даже прост. Да и свич эта та же таблица. Просто она пишется на месте.


Просто здесь означает "нечего думать, трясти надо". Рассмотрим простейший случай:

    String errorMessage(int code)
    {
       switch (code)
       {
           case 0:
              return "success";
           case 2:
              return "file not found";
           // ....
           case 100500:
              return "not exists"
       }


Вполне реальный код, я такого видел достаточно. Таблица, вроде бы, прозрачная. Но вот заметили тестировщики, что код ошибки 1 пропущен. Ты вставляешь единицу в switch, делаешь сборку, отдаешь на тестирование. Мороки хватает.

А ведь хранить таблицу можно где-нибудь вне исполняемого кода. Например, так:

  <errorsList>
     <error code="0" message="success"/>
     <error code="2" message="file not found"/>
<!-- ...... -->
     <error code="100500" message="not exists"/>
  <errorsList>


Тогда вместо длинного switch пишется более сложный построитель таблицы, но зато после доведения его до ума мы этого кода вообще больше не касаемся. И добавление пропущенной единицы обойдется в этом случае намного дешевле.

Таким же образом можно делать, например, обработчики запросов на сервере.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.