AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.07.2008, 16:43   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Break прерывает не только циклы
Случайно наткнулся. Код тоже прерывается...
Старый 01.07.2008, 16:50   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
какой break?
Ctrl+Break или breakpoint (reserved word) ?
Старый 01.07.2008, 16:52   #3  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
который в исходном коде:
X++:
   break;
Старый 01.07.2008, 17:00   #4  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Случайно наткнулся. Код тоже прерывается...
А разве при компиляции не вываливается предупреждение: "BREAK statement found outside legal context (SWITCH, WHILE, DO, and FOR statements)"?
Старый 01.07.2008, 17:02   #5  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,295 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Случайно наткнулся. Код тоже прерывается...
И докуда он прерывается?
__________________
Михаил Андреев
https://www.amand.ru
Старый 01.07.2008, 17:02   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Действительно, вываливается, не посмотрел... По-моему все равно не логично такое поведение, напоминает goto.
Старый 01.07.2008, 17:02   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Да, break прерывает нейкий "логический уровень". Например break спровоцирует выход из метода, если вставлен не в цикл или switch.
Я видел как с помощью прерывают работу методом вместо return. Но это не хорошо. IMHO Его нужно юзать там где это принято - switch. Во всех остальных случаях не поддаваться на соблазн его использования.
Старый 01.07.2008, 17:05   #8  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
и c continue та же история, причем выходит, что два оператора выполняющие по сути разные функции, тут срабатывают одинаково
Старый 01.07.2008, 17:07   #9  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,295 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Да, break прерывает нейкий "логический уровень". Например break спровоцирует выход из метода, если вставлен не в цикл или switch.
Я видел как с помощью прерывают работу методом вместо return. Но это не хорошо.
Спасибо за информацию. Проверил. В 4.0 при компиляции не ошибка, а предупреждение:
Оператор BREAK был найден вне допустимого контекста (операторы SWITCH, WHILE, DO и FOR).
Мягко говоря, я в шоке...
Цитата:
Сообщение от DSPIC Посмотреть сообщение
IMHO Его нужно юзать там где это принято - switch. Во всех остальных случаях не поддаваться на соблазн его использования.
Не только. Можно в ЛЮБЫХ циклах использовать.
__________________
Михаил Андреев
https://www.amand.ru
Старый 01.07.2008, 17:09   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
   ?
в рамках метода. Ну хотя бы...
Старый 01.07.2008, 17:10   #11  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
break - прерывание
continue - переход на следующую итерацию. Если следующей итерации нет, то равносильно break
Старый 02.07.2008, 00:17   #12  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
break - прерывание
continue - переход на следующую итерацию. Если следующей итерации нет, то равносильно break
Интересно, что будет, если использовать break в функции (когда возвращается значение)? Вернется null?
Вообще, такая находка показывает недоработанность синтаксиса языка. Очень плохо, что разработчики не заметили такой проблемы.
Старый 02.07.2008, 00:24   #13  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Интересно, что будет, если использовать break в функции (когда возвращается значение)? Вернется null?.
Полагаю, при выполнении выкинет стандартную ошибку, что функция не содержит команды возврата. Ну или как-то так. Как будто вы просто return не написали. Никакого null'a, конечно, не будет.
Старый 02.07.2008, 11:34   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
IMHO Его нужно юзать там где это принято - switch.
Цитата:
Не только. Можно в ЛЮБЫХ циклах использовать.
Можно-то можно, и в С оператор goto использовать никто не запрещает, но правильнее было бы (это моё субъективное мнение) поставить более красивое условие выхода из цикла вместо использования break, который часто ломает логику. Я к тому чтобы использовать break, если уж без него никак, а не лепить где попало.
Старый 02.07.2008, 14:55   #15  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Можно-то можно, и в С оператор goto использовать никто не запрещает, но правильнее было бы (это моё субъективное мнение) поставить более красивое условие выхода из цикла вместо использования break, который часто ломает логику. Я к тому чтобы использовать break, если уж без него никак, а не лепить где попало.
В тех же "Best Practices" от разработчиков Аксапты пишут, что рекомендуется прерывать блок обработки как можно раньше. И желательно обходиться без лишней лесенки в коде (высокой степени вложенности блоков).
Так что break и continue зачастую позволяют написать более легкий для чтения код. Что лучше:
X++:
for (int i = 0; i < m; ++i)
{
	if (array[i] <= 0) continue;
	
	// do something with array[i]
	// lot's of code
}
// или
for (int i = 0; i < m; ++i)
{
	if (array[i] > 0)
	{
		// do something with array[i]
		// lot's of code
	}
}
Огород в условии цикла совсем не улучшает читаемость кода. А главное помнить, что код для того, чтобы его читать человеку.
Старый 02.07.2008, 15:23   #16  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
В тех же "Best Practices" от разработчиков Аксапты пишут, что рекомендуется прерывать блок обработки как можно раньше. И желательно обходиться без лишней лесенки в коде (высокой степени вложенности блоков).

Так что break и continue зачастую позволяют написать более легкий для чтения код.

(...)

Огород в условии цикла совсем не улучшает читаемость кода. А главное помнить, что код для того, чтобы его читать человеку.
В Ваших словах ключевое значение имеет слово "зачастую"

Для написанния кода (кроме очевидного факта его работоспособности) существуют два основных пожелания:

- Код должен быть "читабельным". Т.е. его можно легко понять
- Код должен быть модифицируемым. Т.е. его можно легко изменить

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

Поэтому данная рекомендация - эта одна из тех рекомендаций, которую нельзя применять "в лоб". Не обдумав все последствия. Как минимум, она очень спорная.
Старый 02.07.2008, 15:33   #17  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Что лучше:
С моей точки зрения 2. лучше:

- там блок, который пропускается явно отделен отступом
- там нет ифа в строчку без отступа и скобок
- если захочется что-то вставить в конец каждой итерации цикла, то это можно будет сделать не анализируя читая весь код тела цикла выше, нет ли там continue

лично я иногда пользуюсь break (когда речь идет про поиск обычно), continue - вообще никогда
Старый 02.07.2008, 15:54   #18  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
- ,     goto
goto - да, а вот break где попало уже не поставишь !
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как копировать только выбранные "заметки"? AKIS-Falcon DAX: Функционал 6 08.02.2005 18:28
Ошибка при переименование номенклатуры и не только Роман Кошелев DAX: Функционал 11 22.10.2004 16:51
Печать только четных или нечетных страниц отчета Yury DAX: Программирование 9 07.02.2003 15:37
Хочу видеть только итоги AKIS DAX: Функционал 1 19.08.2002 11:49
Ошибка при переименование номенклатуры и не только Роман Кошелев DAX: База знаний и проекты 0 19.04.2002 20:32
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:49.