Здравствуйте, vpchelko, Вы писали:
V>Так для свича компилятор сам строит таблицу, почему это не сделать для строк?
Потому что длинные switch/case — ужасны. А если еще кто-нибудь начнет вложенные switch писать — вообще труба. У меня к ним отвращение возниклло после того, как я парочку WndProc-ов на голом WinAPI нафигачил. А с таблицами все просто. Если функционал какой добавить надо, просто добавляешь элементы в таблицу. Весь остальной код не изменяется. switch я использую только в первой версии того, что пищу, той, которая в конечном итоге выбрасывается в мусор.
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
Здравствуйте, Privalov, Вы писали:
P>Потому что длинные switch/case — ужасны. А если еще кто-нибудь начнет вложенные switch писать — вообще труба. У меня к ним отвращение возниклло после того, как я парочку WndProc-ов на голом WinAPI нафигачил. А с таблицами все просто. Если функционал какой добавить надо, просто добавляешь элементы в таблицу. Весь остальной код не изменяется. switch я использую только в первой версии того, что пищу, той, которая в конечном итоге выбрасывается в мусор.
За вложенные свичи надо бить по лицу.
Но, а свичь по enum — это стандартный подход.
Во точно в JAVA есть поддержка строковых enum, я как то это упустил при создании темы.
Сало Украине, Героям Сала
Re[2]: Почему в С/JAVA нет поддержки switch/case для строк?
Если в 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 для строк?
Здравствуйте, vpchelko, Вы писали:
V>За вложенные свичи надо бить по лицу.
С этим согласен.
V>Но, а свичь по enum — это стандартный подход.
Когда-то switch по сообщениям Винды, а внутри него switch по типу какого-нибудь WM_COMMAND тоже считался стандартными подходом. Оставим вложенный, с ним разобрались. Код со switch — это код write only. Он слишком труден для модификации, методы со switch всегда чересчур длинные. Нет, все-таки таблицы рулят.
Re[6]: Почему в С/JAVA нет поддержки switch/case для строк?
Здравствуйте, Privalov, Вы писали:
P>Когда-то switch по сообщениям Винды, а внутри него switch по типу какого-нибудь WM_COMMAND тоже считался стандартными подходом. Оставим вложенный, с ним разобрались. Код со switch — это код write only. Он слишком труден для модификации, методы со switch всегда чересчур длинные. Нет, все-таки таблицы рулят.
Почему труден, как по очень даже прост. Да и свич эта та же таблица. Просто она пишется на месте.
Сало Украине, Героям Сала
Re[6]: Почему в С/JAVA нет поддержки switch/case для строк?
A>Я до сих пор не понимаю, на кой черт в первых реализациях C++ сделали мало кому (на мой взгляд) нужные iostreams.h и не сделали всем нужных стандартных строк (самых элементарных, но которые могли послужить общей базой для всех) и простеньких соллекций (типа CMap/CArray/CList из первой версии MFC)? После чего в каждом компиляторе C++ появлялся свой несовместимый вилосипед — один к MS, другой у Borland и так далее....
Ну, когда С++ только появился, он продолжал быть достаточно легким враппером над ассемблером, а строки тогда всегда были просто потоками байт, и ASCII хватало с головой. Проавда, почему они не появились к 1998-му году, когда уже было понятно, что так жить нельзя — непонятно
Здравствуйте, 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 для строк?
Здравствуйте, 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, делаешь сборку, отдаешь на тестирование. Мороки хватает.
А ведь хранить таблицу можно где-нибудь вне исполняемого кода. Например, так:
Тогда вместо длинного switch пишется более сложный построитель таблицы, но зато после доведения его до ума мы этого кода вообще больше не касаемся. И добавление пропущенной единицы обойдется в этом случае намного дешевле.
Таким же образом можно делать, например, обработчики запросов на сервере.