Оператор условного выбора блока кода Выбор Для
Оператор Выбор Для это отличная замена оператору Если в тех случаях, когда одно и тоже выражение используется в проверяемых условиях многократно.
В языке Перфолента.Net условный выбор блока кода можно сделать с помощью блочного оператора Если, про синтаксис и использование которого можно почитать в статье Условный оператор Если.
Однако, синтаксис оператора Если иногда заставляет вас записывать одно и то же выражение снова и снова. Это не только увеличивает текст программы, но и ведет к снижению быстродействия. Рассмотрим пример, в котором значение переменной МоёЗначение проверяется несколько раз.
Если
МоёЗначение = 1
Тогда
//блок
кода
ИначеЕсли МоёЗначение
= 3 или МоёЗначение = 4 или МоёЗначение = 5 Тогда
//блок
кода
ИначеЕсли МоёЗначение =
10 Тогда
//блок
кода
Иначе
//блок
кода
КонецЕсли
Для сокращения записи и уменьшения количества вычислений можно использовать блочный оператор Выбор Для. Запишем предыдущий пример новым способом.
Выбор Для МоёЗначение
Когда 1 Тогда
//блок
кода
Когда 3, 4, 5 Тогда
//блок
кода
Когда 10 Тогда
//блок
кода
Иначе
//блок
кода
КонецВыбора
Умнику на заметку: Ключевые слова Для и Тогда не являются обязательными и могут быть пропущены.
В приведенном примере значение переменной МоёЗначение вычисляется один раз и затем сравнивается со всеми проверяемыми значениями. Вместо переменной может быть задано любое выражение, результат вычисления которого будет использован при сравнениях в условиях после ключевого слова Когда.
Обратите внимание, что вместо оператора Или используется запятая.
Секция Когда.
В примере приведенном выше секция Когда повторяется несколько раз, но блок кода будет выполнен только в первой из них, у которой выполнится условие, включая дополнительные условия, заданные ключевым словом При, если они используются.
Секция Иначе.
В примере приведенном выше можно так же увидеть не обязательную секцию Иначе, блок кода в которой выполнится в том случае, если не выполнится ни одно условие в секциях Когда.
Использование бинарных операторов сравнения.
По умолчанию в операциях сравнения используется оператор равно, однако, его можно переопределить другим бинарным оператором сравнения, например, <, >, <=, >=, <>, Это, ЭтоНе, ЭтоТип, ЭтоНеТип.
Умнику на заметку: Другие бинарные и унарные операторы, кроме указанных операторов сравнения, воспринимаются как часть выражения правого операнда в операции сравнения. Вы можете допустить ошибку, если используете, например, унарный оператор Не. Запись Когда НЕ 5 трактуется как Когда =(НЕ 5), что эквивалентно Когда Ложь.
Выбор Инд
Когда <3
ВыводСтроки "Значение
Инд < 3" //меньше
3
Когда >16
ВыводСтроки "Значение
Инд >16" //больше 16
Когда <>5
ВыводСтроки "Значение
Инд <>5" //не равно 5
Иначе ВыводСтроки "Другое
"+Инд
КонецВыбора
Приведем пример с операторами сравнения Это и ЭтоНе. В этом случае мы будем сравнивать со значением Неопределено, но можно сравнивать и с конкретными объектами.
Выбор Для МойОбъект
Когда Это Неопределено ВыводСтроки "Мой объект
НЕ задан…"
Когда ЭтоНе Неопределено ВыводСтроки "Мой объект
существует!"
КонецВыбора
И один из самых интересных случаев — это использование операторов ЭтоТип и ЭтоНеТип.
Допустим, что у нас есть классы Кот и Собака родителем которых является класс Животное, а переменная МоёЖивотное типа Животное содержит значение одного из двух возможных типов. Определим, кто же у нас в переменной.
Выбор Для МоёЖивотное
Когда ЭтоТип Кот ВыводСтроки "Это мой
кот!"
Когда ЭтоТип Собака
ВыводСтроки "Это
моя собака!"
КонецВыбора
Операторы ЭтоТип и ЭтоНеТип позволяют задавать тип двумя способами – непосредственной записью и при помощи функции Тип(). Выше мы использовали непосредственную запись, а теперь напишем то же самое с использованием функции Тип().
Выбор Для МоёЖивотное
Когда ЭтоТип Тип("Кот") ВыводСтроки
"Это мой кот!"
Когда ЭтоТип Тип("Собака") ВыводСтроки "Это моя
собака!"
КонецВыбора
Добавочное условие При.
Иногда одного сравнения в условии не хватает. В таких случаях можно задать дополнительное условие с помощью ключевого слова При. Правила определения дополнительного условия такие же, как в операторе Если. Дополнительное условие проверяется только тогда, когда выполнилось основное условие.
Выбор Для МоёЖивотное
Когда ЭтоТип Кот При МоёЖивотное.Цвет="рыжий" ВыводСтроки "Это мой
рыжий кот!"
Когда ЭтоТип Кот При МоёЖивотное.Цвет="черный" ВыводСтроки "Это мой
черный кот!"
Когда ЭтоТип Собака При МоёЖивотное.Цвет="рыжий" ВыводСтроки "Это моя
рыжая собака!"
Когда ЭтоТип Собака При МоёЖивотное.Цвет="черный" ВыводСтроки "Это моя черная
собака!"
КонецВыбора
В приведенном примере свойство Цвет принадлежит классу Животное, поэтому дополнительное условие проверяется одинаково для кота и для собаки, но что, если нам надо в дополнительном условии проверить одно или несколько свойств принадлежащих коту, в том случае, если это кот, или принадлежащих собаке, если это собака?
Это можно сделать, например, вот так:
Выбор Для МоёЖивотное
Когда ЭтоТип Кот При ТипКТипу(МоёЖивотное, "Кот").ГибкостьСпины="высокая" И ТипКТипу(МоёЖивотное, "Кот").Пятнистость="высокая"
ВыводСтроки "Это
гибкий пятнистый кот! По имени "+ ТипКТипу(МоёЖивотное, "Кот").Имя
Когда ЭтоТип Собака При ТипКТипу(МоёЖивотное, "Собака").ДлинаШерсти="высокая" И ТипКТипу(МоёЖивотное, "Собака").ГромкостьЛая="высокая"
ВыводСтроки
"Это громкая длинношерстная собака! По кличке
"+ ТипКТипу(МоёЖивотное, "Собака").Кличка
КонецВыбора
Выглядит довольно громоздко из-за того, что приходится приводить тип животного к классу, имеющему необходимые свойства. К тому же, операция приведения типа выполняется по 4 раза на каждую секцию Когда, а она вовсе не бесплатная и за неё приходится платить потерей быстродействия работы программы.
Для упрощения кода и улучшения его быстродействия воспользуемся дополнительным ключевым словом Для оператора ЭтоТип, с помощью которого будем создавать переменную для только что определенного в секции Когда типа.
Выбор Для МоёЖивотное
Когда ЭтоТип Кот Для МойКотик При МойКотик.ГибкостьСпины="высокая" И МойКотик.Пятнистость="высокая"
ВыводСтроки "Это
гибкий пятнистый кот! По имени "+МойКотик.Имя
Когда ЭтоТип Собака Для МояСобачка При МояСобачка.ДлинаШерсти="высокая" И МояСобачка.ГромкостьЛая="высокая"
ВыводСтроки
"Это громкая длинношерстная собака! По кличке
"+МояСобачка.Кличка
КонецВыбора
Переменные МойКотик и МояСобачка создаются в тот момент, когда выполняется условие в операторе ЭтоТип. При этом определение и приведение типа объекта к необходимому выполняется всего один раз на каждую секцию Когда.
Тот же приём можно использовать в случае, когда дополнительное условие не используется, но в самом блоке кода идет многократное обращение к только что определенному типу.
Выбор Для МоёЖивотное
Когда ЭтоТип Кот Для МойКотик
ВыводСтроки "Это
кот по имени: "+МойКотик.Имя
ВыводСтроки "Гибкость
спины: "+МойКотик. ГибкостьСпины
ВыводСтроки "Пятнистость:
"+МойКотик. Пятнистость
Когда ЭтоТип Собака Для МояСобачка
ВыводСтроки "Это
собака по кличке: "+ МояСобачка. Кличка
ВыводСтроки "Длина
шерсти: "+ МояСобачка. ДлинаШерсти
ВыводСтроки "Громкость
лая: "+ МояСобачка. ГромкостьЛая
КонецВыбора
В том случае, когда в условии секции Когда перечисляются через запятую несколько выражений, дополнительное условие При используется для каждого выражения отдельно.
А=3
Б=5
Выбор Для МоёЗначение
Когда 3 При А=3,
4 При А=4 или Б=4,
5 При Б=5
Тогда
//блок
кода
Иначе
//блок
кода
КонецВыбора
Вывод:
Условный блочный оператор Выбор Для позволяет сделать код программы лучше читаемым, а часто и быстрее работающим. Он может с успехом применяться для замены оператора Если в тех случаях, когда одно и то же значение проверяется в условиях несколько раз.
Сергей Рогаткин
К началу статьи
Предыдущая статья:
Циклы в языке Перфолента
Следующая статья:
Оператор Попытка. Структурная обработка ошибок.
Вернуться в раздел:
Синтаксис языка Перфолента