Оператор условного выбора блока кода Выбор Для

Материал из ТХАБ.РФ
Версия от 23:02, 18 июня 2020; Bee (обсуждение | вклад) (не понятно, о чем фраза "в данном случае", во втором предложении после введения)

Перейти к: навигация, поиск

Оператор Выбор Для это отличная замена оператору Если в тех случаях, когда одно и тоже выражение используется в проверяемых условиях многократно.

Оператор Выбор Для в случае необходимости проверки значения разных выражений в пределах одного блока, не поможет.

В языке Перфолента.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
           Тогда
   //блок кода    
Иначе
   //блок кода    
КонецВыбора        

Вывод:

Условный блочный оператор Выбор Для позволяет сделать код программы лучше читаемым, а часто и быстрее работающим. Он может с успехом применяться для замены оператора Если в тех случаях, когда одно и то же значение проверяется в условиях несколько раз.

Ссылки