02.09.2004, 07:21 | #1 |
Участник
|
Можно ли исп. switch задать диапазон для case ???
Вопрос такой:
в switch'e в case'ах можно задавать значения как одиночные, так и через запятую, вопрос а что если их будет например от 1 до 1000 ? Можно ли указать как-нибудь интервал типа 1..1000 или что-то в этом роде? Либо придется использовать опртр. If ? switch( exp ) { case 1: ...break; case 2,3,4: ... break; default: ... breal; }
__________________
Смотрим в книгу - видим фигу. |
|
02.09.2004, 09:49 | #2 |
Administrator
|
Вообще говоря диапазон задается через 2 точки (..). Но это действует для запросов (Query) для задания Range. В явном виде код не компилится, если в switch вставить 2 точки. Посему напрашивается вывод, что данная фича не реализована .
На самом деле в аксапте есть моменты, которые как бы должны работать, но увы.. (для примера update_recordset работает далеко не так, как мог бы предположить чел, работавший с SQL Server). |
|
02.09.2004, 10:01 | #3 |
Модератор
|
Стандартая фича, из С еще..
Стандартая фича, из С еще.. PHP код:
|
|
02.09.2004, 10:05 | #4 |
Участник
|
Цитата:
Здесь отрабатываются значения 1, 234, 5 и все остальные.
|
|
02.09.2004, 10:09 | #5 |
Administrator
|
Да, 234 обработается и выполнение свалится в код который написан после 5 (поэтому и ставится break для разделения веток).
2George Nordic: Да, посыпаю голову пеплом- забыл. Привык к VB-паскалю |
|
02.09.2004, 10:12 | #6 |
Участник
|
Можно поизвращаться, зависит от задачи
типа (не помню целочисленного деления в аксапте...) switch (exp div 1000) { case 0 : ...break; case 1: ....break; } |
|
02.09.2004, 10:16 | #7 |
Участник
|
Обработается не после 5, а после default. Я думаю нужно использовать if .
|
|
02.09.2004, 10:21 | #8 |
Модератор
|
Сработает.
Хотя, если баловаться с преобразованием в exspression... вдруг результат окажется кратным 256 Фича, как я уже говорил, стандартная. Более того, в Axapta ей рекомедуют пользоваться (в С++, кажется, наоборот - предпочтительнее были конструкции if - else if) Emum'ы отрабатывает - и ладно С Уважением, Георгий. |
|
02.09.2004, 11:44 | #9 |
Дмитрий Ерин
|
В случае больших диапазонов, когда перечислять все через запятую слишком накладно,а пользоваться if..else не хочется, можно пойти несколько кривым, но достаточно удобным и "читабельным" путем. Вот пример:
PHP код:
|
|
|
За это сообщение автора поблагодарили: MerkurievV (0). |
02.09.2004, 18:23 | #10 |
Участник
|
Ruff - браво! А я маялся как сделать Switch незваисмым от конкретной переменной и конкретного перечисления.
PHP код:
|
|
03.09.2004, 05:13 | #11 |
Участник
|
Очень интересное решение, спасибо за помощь
__________________
Смотрим в книгу - видим фигу. |
|
03.09.2004, 10:33 | #12 |
Модератор
|
Отличные идеи.... 3 способа использования case с интервалом значений.
Предлагаю модераторам перенести в "Полезное" или "Базу знаний" С Уважением, Георгий. |
|
03.09.2004, 15:38 | #13 |
Участник
|
Спасибо за рекомендацию.
Спасибо за грамотные ответы. |
|
09.09.2004, 10:05 | #14 |
Участник
|
Ruff спасибо... тоже задумывался над проблемой, как в свич заставить проверять выражения... а ларчик так просто открывался... )))
|
|
22.12.2004, 06:47 | #15 |
Участник
|
Запоздало вставлю свои 5 копеек. Давайте просто сравним два участка кода:
PHP код:
PHP код:
НО В C-ПОДОБНЫХ ЯЗЫКАХ ЭТО НЕ ТАК! Во всех. Поэтому рекомендация не пользоваться case справедлива и для X++. Избегайте case и будет вам счастье. |
|
22.12.2004, 10:20 | #16 |
Модератор
|
Хм...
Мне кажется, Х++ - скорее скриптоподобный , чем с-подобный язык... В основе которого положена теория рефакторинга, в которой как раз рекомендуется использовать switch/case для читабельности кода. Кстати, неплохая тема для новой ветки Насколько я помню, о чем-то подобном спорили... С Уважением, Георгий. |
|
22.12.2004, 11:04 | #17 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Хм... Мне кажется, Х++ - скорее скриптоподобный , чем с-подобный язык... Насколько я знаю за скриптовые языки считаются интерпретируемые языки в которых отсутствует типизация переменных - т.е. типы переменных деляться на две ветки - VARIANT и агрегатные. С этой точки зрения X++ типичный интерпретируемый язык в котором проверка синтаксиса программы почему то названа громким словом "компиляция". Под си-подобными языкоми я имею ввиду языки унаследовавшие синтаксис C/C++, а в этом X++ ничуть не хуже своих соплеменников типа явы или перла. Цитата:
В основе которого положена теория рефакторинга,
Цитата:
в которой как раз рекомендуется использовать switch/case для читабельности кода.
Поэтому еще раз повторяю - в сиподобных языках у конструкции switch нет никаких преимуществ перед конструкцией if / else, ни по читабельности ни даже по кол-ву символов которые нужно писать в коде для реализации того или иного решения. Посмотрите еще раз на извращение с switch ( true ) - - прикольное конечно же решение не спорю, но вводить ф-ю (пусть даже глобальную) ради того чтобы написать PHP код:
PHP код:
Минус switch-а состоит в ограниченности применения - хотя с помощью switch ( true ) можно добится любого поведения, но ценность switch-а для читаемости кода и состоит именно в том что он сообщает программисту что далее идут проверки на строгое равенство выражения в switch() с константами. P.S. И еще одно - согласно принципам рефакторинга (немногое что я успел вычитать в ссылке, которую давал mazzy) конструкции switch( ... ) в коде надо устранять заменяя полиморфизмом в ООП. |
|
24.12.2004, 03:21 | #18 |
Banned
|
Цитата:
Изначально опубликовано Alks
С этой точки зрения X++ типичный интерпретируемый язык в котором проверка синтаксиса программы почему то названа громким словом "компиляция". Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных. И..., господа, проще надо быть с рефакторингом Есть проблемы и поважнее, чем сравнение двух несчастных операторов. |
|
24.12.2004, 12:56 | #19 |
Дмитрий Ерин
|
Цитата:
Изначально опубликовано Alks
Посмотрите еще раз на извращение с switch ( true ) - - прикольное конечно же решение не спорю, но вводить ф-ю (пусть даже глобальную) ради того чтобы написать ... - ОНО ТОГО НЕ СТОИТ Не нравится - не ешь! Меня вот, например, коробит от словосочетания else if почти так же, как от goto Но это - дело моего вкуса... При этом switch (true) сам использовал в жизни 1 или 2 раза! И что с того? Люди спросили, я посоветовал, а "рекомендуется, не рекомендуется" - это уже лирика. Функцию вообще чисто для красоты добавил (пример-то высосан из пальца)... Хотя, вот сейчас даже придумал одно преимущество ее использования: представьте, что в какой-то момент нужно поменять логику таким образом, чтобы крайние значения не включались в диапазоны! И при этом имеем switch на пару десятков case-ов (или пару десятков else if, кому как нравится). Вот и функция пригодится... Цитата:
Есть проблемы и поважнее, чем сравнение двух несчастных операторов
|
|
25.12.2004, 18:49 | #20 |
Участник
|
Цитата:
Изначально опубликовано EVGL
[B] Ну, не смешно. В свое время спросил Эрика Дамгарда, создает ли Аксапта при компиляции промежуточный байт-код, на что был ответ: создает. За счет этого можно воспроизвести следующий фокус: программно удалить код метода без перекомпиляции, а система продолжит исполняться. До следующей попытки компиляции уже не существующего исходного кода. Цитата:
Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных.
|
|
Теги |
switch, диапазон условий, интерпретатор, компилятор, полезное, программирование, разработка, условный оператор |
|
|