![]() |
#1 |
Участник
|
![]()
Вопрос такой:
в switch'e в case'ах можно задавать значения как одиночные, так и через запятую, вопрос а что если их будет например от 1 до 1000 ? Можно ли указать как-нибудь интервал типа 1..1000 или что-то в этом роде? Либо придется использовать опртр. If ? switch( exp ) { case 1: ...break; case 2,3,4: ... break; default: ... breal; }
__________________
Смотрим в книгу - видим фигу. |
|
![]() |
#2 |
Administrator
|
Вообще говоря диапазон задается через 2 точки (..). Но это действует для запросов (Query) для задания Range. В явном виде код не компилится, если в switch вставить 2 точки. Посему напрашивается вывод, что данная фича не реализована
![]() На самом деле в аксапте есть моменты, которые как бы должны работать, но увы.. (для примера update_recordset работает далеко не так, как мог бы предположить чел, работавший с SQL Server). |
|
![]() |
#3 |
Модератор
|
Стандартая фича, из С еще..
Стандартая фича, из С еще.. PHP код:
|
|
![]() |
#4 |
Участник
|
Цитата:
Здесь отрабатываются значения 1, 234, 5 и все остальные.
|
|
![]() |
#5 |
Administrator
|
Да, 234 обработается и выполнение свалится в код который написан после 5 (поэтому и ставится break для разделения веток).
2George Nordic: Да, посыпаю голову пеплом- забыл. Привык к VB-паскалю ![]() |
|
![]() |
#6 |
Участник
|
Можно поизвращаться, зависит от задачи
типа (не помню целочисленного деления в аксапте...) switch (exp div 1000) { case 0 : ...break; case 1: ....break; } |
|
![]() |
#7 |
Участник
|
Обработается не после 5, а после default. Я думаю нужно использовать if .
|
|
![]() |
#8 |
Модератор
|
Сработает.
Хотя, если баловаться с преобразованием в exspression... вдруг результат окажется кратным 256 ![]() Фича, как я уже говорил, стандартная. Более того, в Axapta ей рекомедуют пользоваться (в С++, кажется, наоборот - предпочтительнее были конструкции if - else if) Emum'ы отрабатывает - и ладно ![]() С Уважением, Георгий. |
|
![]() |
#9 |
Дмитрий Ерин
|
В случае больших диапазонов, когда перечислять все через запятую слишком накладно,а пользоваться if..else не хочется, можно пойти несколько кривым, но достаточно удобным и "читабельным" путем. Вот пример:
PHP код:
|
|
|
За это сообщение автора поблагодарили: MerkurievV (0). |
![]() |
#10 |
Участник
|
Ruff - браво! А я маялся как сделать Switch незваисмым от конкретной переменной и конкретного перечисления.
PHP код:
|
|
![]() |
#11 |
Участник
|
![]()
Очень интересное решение, спасибо за помощь
![]()
__________________
Смотрим в книгу - видим фигу. |
|
![]() |
#12 |
Модератор
|
Отличные идеи.... 3 способа использования case с интервалом значений.
Предлагаю модераторам перенести в "Полезное" или "Базу знаний" С Уважением, Георгий. |
|
![]() |
#13 |
Участник
|
Спасибо за рекомендацию.
Спасибо за грамотные ответы. |
|
![]() |
#14 |
Участник
|
Ruff спасибо... тоже задумывался над проблемой, как в свич заставить проверять выражения... а ларчик так просто открывался... )))
|
|
![]() |
#15 |
Участник
|
Запоздало вставлю свои 5 копеек. Давайте просто сравним два участка кода:
PHP код:
PHP код:
НО В C-ПОДОБНЫХ ЯЗЫКАХ ЭТО НЕ ТАК! Во всех. ![]() Поэтому рекомендация не пользоваться case справедлива и для X++. Избегайте case и будет вам счастье. ![]() |
|
![]() |
#16 |
Модератор
|
Хм...
Мне кажется, Х++ - скорее скриптоподобный ![]() Кстати, неплохая тема для новой ветки ![]() Насколько я помню, о чем-то подобном спорили... С Уважением, Георгий. |
|
![]() |
#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( ... ) в коде надо устранять заменяя полиморфизмом в ООП. ![]() |
|
![]() |
#18 |
Banned
|
Цитата:
Изначально опубликовано Alks
С этой точки зрения X++ типичный интерпретируемый язык в котором проверка синтаксиса программы почему то названа громким словом "компиляция". ![]() Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных. И..., господа, проще надо быть с рефакторингом ![]() |
|
![]() |
#19 |
Дмитрий Ерин
|
Цитата:
Изначально опубликовано Alks
Посмотрите еще раз на извращение с switch ( true ) - ![]() ... - ОНО ТОГО НЕ СТОИТ ![]() Не нравится - не ешь! ![]() ![]() ![]() ![]() Функцию вообще чисто для красоты добавил (пример-то высосан из пальца)... Хотя, вот сейчас даже придумал одно преимущество ее использования: представьте, что в какой-то момент нужно поменять логику таким образом, чтобы крайние значения не включались в диапазоны! И при этом имеем switch на пару десятков case-ов (или пару десятков else if, кому как нравится). Вот и функция пригодится... Цитата:
Есть проблемы и поважнее, чем сравнение двух несчастных операторов
|
|
![]() |
#20 |
Участник
|
Цитата:
Изначально опубликовано EVGL
[B] Ну, не смешно. В свое время спросил Эрика Дамгарда, создает ли Аксапта при компиляции промежуточный байт-код, на что был ответ: создает. За счет этого можно воспроизвести следующий фокус: программно удалить код метода без перекомпиляции, а система продолжит исполняться. До следующей попытки компиляции уже не существующего исходного кода. ![]() ![]() Цитата:
Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных.
![]() |
|
Теги |
switch, диапазон условий, интерпретатор, компилятор, полезное, программирование, разработка, условный оператор |
|
|