Язык программирования Перфолента.Net - Официальный сайт

 Язык программирования Перфолента.Net - Официальный сайт.

Поиск   
Главная :: О проекте :: Контакты :: Обратная связь :: Благодарности :: ВходГость

   >   >   >   > 



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

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


Оператор Выбор Для в данном случае не поможет.

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

 

Вывод:

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

 

 




К началу статьи


Предыдущая статья:
Циклы в языке Перфолента

Следующая статья:
Оператор Попытка. Структурная обработка ошибок.

Вернуться в раздел:
Синтаксис языка Перфолента
  Поддержи проект!

Вы можете поддержать разработку Перфоленты, перечислив любую удобную сумму, которая пойдет на развитие языка и поддержку инфраструктуры сайта.

  Новости:
      04.01.2025 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.15.0_CE
      23.09.2024 Опубликована новая статья: "Конструируем класс. Делегаты."
      30.08.2024 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.14.0
      24.05.2024 Обновлён справочный раздел сайта
      01.07.2023 Новая версия 0.4.13.0 языка программирования Перфолента.Net
       Все новости