| 
			
			 | 
		#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 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Хм... 
		
		
		
		
		
		
		
	Мне кажется, Х++ - скорее скриптоподобный  , чем с-подобный язык... В основе которого положена теория рефакторинга, в которой как раз рекомендуется использовать switch/case для читабельности кода.Кстати, неплохая тема для новой ветки ![]() Насколько я помню, о чем-то подобном спорили... С Уважением, Георгий.  | 
| 
	
 | 
| 
			
			 | 
		#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 ) -   - прикольное конечно же решение не спорю, но вводить ф-ю (пусть даже глобальную) ради того чтобы написать ... - ОНО ТОГО НЕ СТОИТ ![]() Не нравится - не ешь!   Меня вот, например, коробит от словосочетания else if почти так же, как от goto  Но это - дело моего вкуса... При этом switch (true) сам использовал в жизни 1 или 2 раза!   И что с того? Люди спросили, я посоветовал, а "рекомендуется, не рекомендуется" - это уже лирика. ![]() Функцию вообще чисто для красоты добавил (пример-то высосан из пальца)... Хотя, вот сейчас даже придумал одно преимущество ее использования: представьте, что в какой-то момент нужно поменять логику таким образом, чтобы крайние значения не включались в диапазоны! И при этом имеем switch на пару десятков case-ов (или пару десятков else if, кому как нравится). Вот и функция пригодится... Цитата: 
	
		
			Есть проблемы и поважнее, чем сравнение двух несчастных операторов
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Изначально опубликовано EVGL  
[B] Ну, не смешно. В свое время спросил Эрика Дамгарда, создает ли Аксапта при компиляции промежуточный байт-код, на что был ответ: создает. За счет этого можно воспроизвести следующий фокус: программно удалить код метода без перекомпиляции, а система продолжит исполняться. До следующей попытки компиляции уже не существующего исходного кода.   ОДНАКО НИКТО ДО СИХ ПОР НЕ СМЕЕТ НАЗВАТЬ BASIC КОМПИЛЯТОРОМ. ![]() Цитата: 
	
		
			Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных.
		
	 
 
		 | 
| 
	
 | 
| Теги | 
| switch, диапазон условий, интерпретатор, компилятор, полезное, программирование, разработка, условный оператор | 
| 
	
	 | 
	
		
		
  |