Разработка программного обеспечения раньше требовала огромных сил. С развитием языков программирования соответствующий процесс стал значительно проще. Появились различные синтаксисы, при помощи которых удается создавать качественное ПО. Наиболее популярными являются языки, относящиеся в СИ-семейству (C#, C, C++). Они выступают не только самыми известными, но и функциональными.
Далее предстоит рассмотреть такой элемент программирования, как шаблоны в C и C++. С их помощью удается намного быстрее генерировать классы, а также разнообразные функции. Представленная информация в большей степени ориентирована на опытных программистов. Материалы пригодятся также тем, кто уже умеет писать элементарные приложения.
Определение
Шаблон – компонент, используемый для быстрой генерации новых классов и функций, имеющих один и тот же функционал. Иногда соответствующие элементы называются обобщенными или родовыми.
В качестве параметров шаблона класса int выступает тип. Реже – значения записанных разработчиком типов.
Рассматриваемый компонент будет автоматически генерироваться по типах аргументов, если речь идет о функциях. В случае с классами предстоит явно записать параметры и аргументы при формировании template.
Методы классов могут выступать в качестве шаблона функции. Для этого их необходимо грамотно внедрить в исходный программный код. Методы template class – это и есть шаблоны.
Рассматриваемый компонент дает возможность оперировать данными разных типов (int и не только). Привязка к некоторому конкретному типу информации отсутствует. Работа выполняется над некоторым обобщенным информационным типом, а не над int и ему подобными компонентами. Соответствующий «обобщенный» элемент должен иметь имя. Пример – тип T.
Объявление шаблона класса – это описание. Создание реального класса с заданным типом информации будет производиться компилятором. Операция осуществляется в момент компиляции при объявлении классового объекта.
Преимущества
Class template дает некоторые преимущества при разработке приложения:
- Избегание повторяемости написания программного кода для разных типов (int, void, double и так далее). Программный код вместе с методами и функциями будет написан для некоторого обобщенного типа T. В качестве «названия» обобщенного типа может выступать любая запись.
- Уменьшение общего объема исходного теста. Следствием этого становится повышение читабельности программного обеспечения.
- Обеспечение удобных механизмов передачи int и других аргументов в классовый шаблон для их дальнейшей обработки классовыми методами.
Шаблоны класса – это удобно и практично. В особо крупном программном обеспечении соответствующий прием обеспечит более быструю и практичную разработку. А еще – быстродействие получившегося на выходе продукта.
Общая форма представления
Шаблоны класса могут как включать в себя аргументы, так и нет. Общая форма представления рассматриваемого компонента, когда у объекта нет параметров, начинается с ключевого слова. А именно – template.
Вот – пример простейшего общего случая объявления шаблона класса, исключающего наличие тех или иных аргументов:
Здесь:
- T – это обобщенное имя типа, который будет непосредственно использоваться классовыми методами;
- ClassName – имя класса, который включает в себя методы управления обобщенным типом класса (не int и ему подобным).
Это – всего лишь один из вариантов представления шаблона класса. Чаще всего рассматриваемый элемент включает в свой состав разнообразные аргументы.
Объект template класса
При работе с изучаемым средством ускорения разработки программного обеспечения программистам нередко приходится иметь дело с объявлением объектов шаблонных классов. Общая форма записи в C++ будет такой:
Здесь:
- ClassName – имя шаблонного класса;
- type – конкретный вид информации в приложении (пример – int);
- objName – имя объекта (экземпляра) имеющегося класса.
При формировании рассматриваемого элемента ключевое слово class может быть изменено. Для этого используется ключевое слово typename. Общая синтаксическая форма объявления шаблона станет такой:
Соответствующий фрагмент позволяет понять, как записывать изучаемый компонент, заменив class на typename.
С аргументами
В шаблонах иногда требуется задействовать некоторые аргументы. Они могут быть использованы методами, которые описаны в изучаемом компоненте программирования.
Вот – общая форма представления шаблона, в котором поддерживаются аргументы (int, var или другие):
Здесь:
- T – некоторый обобщенный информационный вид;
- type1, …typeN – конкретные виды информации, используемые системой (с именами var1, …, varN или int);
- var1, …, varN – имена аргументов, используемые в шаблоне записи.
А вот – общая синтаксическая форма объявления объекта template class всего с одним параметром (аргументом):
В соответствующем фрагменте:
- ClassName – название шаблона;
- type – информационный вид, для которого будет формироваться реальный class (пример – int);
- arg – значение используемого в шаблоне аргумента;
- objName – имя объекта, используемого в качестве template class.
Один аргумент – это не исчерпывающая ситуация. В некоторых задачах рассматриваемый компонент разработки поддерживает два и более параметров.
Два аргумента
Вот – пример, в котором template class поддерживает два аргумента. Он называется CMyArray. Включает в себя методы обработки числовых массивов. В качества типа компонентов можно использовать вещественные компоненты или целочисленные (int).
Здесь template class получает два целых числа (int):
- Count – целое число элементов в заданном массиве. Применяется для инициализации class через конструктор с 1 параметром.
- Num – число, которое используется для непосредственного проведения различных операций над массивами (тоже выражается как int).
Соответствующие числа применяются в методах для выполнения разнообразных операций над массивом. В шаблоне применяются следующие методы и данные:
- Количество элементов в пределах заданного «множества» – n.
- Массив элементов (чисел) A заданной размерности (int 10).
- Метод Power – используется для возведения составляющих A в степень num. Значение num – входной параметр (аргумент)
- Метод CalcNum. Задействуется разработчиком для того, чтобы подсчитывать количество компонентов больше заданного параметра num.
Все это – «база», о которой должен быть в курсе каждый разработчик. Далее предстоит познакомиться с template class в C#.
В C#
Рассматриваемый компонент поддерживается не только в C++, но и в других языках СИ-семейства. Пример – C#. Он появился в языке разработки с версией 7.0. С тех пор каждый новый выпуск версии C# сопровождается новыми шаблонными расширениями.
Для сопоставления шаблонов в C# используются операторы и выражения:
- is;
- switch (оператор);
- switch (выражение, характерное языку с версии 8.0).
В таких конструкциях допускается сравнение входного выражения с любым из следующих «образцов»:
- Шаблон объявления. Используется для проверки типа выражения в среде реализации. При условии равенства присваивает объявленной переменной результат соответствующего выражения.
- Шаблоны типа (int и не только). Задействуются для проверки типа выражения непосредственно в среде реализации. Компонент известен с C# 9.0.
- Константы. Для проверки на факт того, равен ли результат выражения указанной константе. Она может быть выражена int или другими «значениями».
- Реляционные templates. Используются для сравнения результата расчетов заданного выражения с той или иной константой. Появились в C# 9.0.
- Логические templates. Проверяют, соответствует ли имеющаяся запись логической комбинации templates. Появилась данная категория тогда же, когда и предыдущая.
- Свойства. Возникли такие записи в версии 8.0. Проверяют, используют ли свойства или поля выражения вложенных шаблонам.
- Позиционный. Отвечает за деконструкцию результата заданных расчетов. Позволяет удостовериться в факте соответствия результатов значениям вложенных templates. Тоже появился в версии языка 8.0.
- Var. Сравнивает любые выражения. После этого присваивает полученный результат.
- Пустой переменной. Отвечает за сравнение любых выражений. Соответствующая концепция возникла в версии языка 8.0.
Логические templates, а также свойств и позиционные – это рекурсивные записи. Они поддерживают вложенность.
Объявление и тип
В C# при работе с template classes могут использоваться разнообразные templates. Первая категория – объявления и типов. Они применяются для того, чтобы проверить совместимость с указанным видом в среде разработки. с помощью шаблона объявления допускается также создание новой локальной переменной (int и не только). Если «образец объявления» соответствует выражению, переменная получит результат преобразований. Вот – наглядный пример реализации:
Начиная с C# версии 7.0, template объявления с типом T соответствует выражению, если его результат отличен от Null. Также соответствие могут повлечь за собой следующие ситуации:
- тип результата в среде реализации – T;
- результирующий тип – это производная от T;
- результатом становится тип, допускающий значение NULL и имеющий в качестве «базы» T;
- поддерживается упаковка-преобразование или распаковка-преобразования.
В случае с template type «образец» будет соответствовать написанной «команде», если результат произведенных расчетов не равен NULL. Здесь необходимо также учитывать тип в среде выполнения. Он должен соответствовать любому из ранее указанных требований.
Константы
Рассматривая шаблоны класс и другие их типы, в C# необходимо обратить внимание на шаблон константы. Он появился в 7 версии языка разработки. Позволяет проверять, равен ли результат произведенных расчетов заданному неизменному выражению (оно может являться int). Вот – пример:
В процессе работы с const templates можно использовать любую константную запись:
- целочисленный литерал (int) или с плавающей запятой;
- символьные или строковые литералы;
- логические значения true или false;
- параметры enum;
- имя объявленного поля, поддерживающий модификатор const или локальный компонент;
- null.
Рекомендуется пользоваться соответствующий template для проверки на нулевое значение (null). Для этого подойдет следующий пример:
Компилятор будет гарантировать, что при расчетах x is null не будет осуществляться вызов перегруженного пользователем оператора равенства.
С версии C# 9.0 допускается использование константной «конструкции» null с отрицанием. В этом случае проверяется факт неравенства «пустоте».
Реляционный вид
Используется такая запись для проверки результатов (вида int и не только) с константами. Прием появился в 9 версии рассматриваемого языка разработки.
В реляционных templates допускается применение любых операторов отношений:
- больше;
- меньше;
- больше или равно;
- меньше или равно.
Первая часть the template – это константа. Соответствующий вид выражения не должен меняться. Он может выступать в виде целого числа (int), компонентами с плавающими точками, символами или enum.
Для проверки нахождения итогового результата произведенных расчетов в том или ином диапазоне пользователю предстоит воспользоваться конъюнкцией (and):
Когда на выходе получается null или не удается преобразовать результат выражения в константный вид через трансформацию, допускающую NULL-значение, или распаковки-преобразования, реляционный template не соответствует изначально написанному выражению.
Логический вид
Начиная с версии C# 9.0, разработчики могут использовать блоки объединения (not, and, or) для создания логических templates:
- Отрицания. Используется блок not, а не int. Он соответствует выражению, если template class с отрицанием не соответствует имеющемуся выражению.
- Конъюнкции. Для соответствующей операции используется and, соответствующий выражению. Данный принцип соблюдается, если оба templates соответствуют имеющемуся выражению.
- Дизъюнкции через or. Соответствие обеспечивается, если хотя бы один из шаблонов соответствует выражению.
Блок объединения and поддерживает более высокий приоритет, чем or. Для выставления приоритета в программном коде используются круглые скобки.
Свойства
В 8 версии рассматриваемого языка появились templates свойств. Они работают не только с int, но и другими видами информации. Такие инструменты помогают сопоставлять свойства или поля в выражении с вложенными templates:
Соответствие подтверждается, если результат расчетов не равен Null, а каждый вложенный компонент соответствует общему свойству/полю итогового выражения.
Данная категория templates является рекурсивной. Это значит, что шаблон int может быть использован в качестве вложенного. Начиная с 10 версии C#, допустимо ссылаться на вложенные свойства или поля в шаблоне свойства. Пример – рефакторинг метода в эквивалентный код:
Выше – наглядный вариант реализации задачи.
Позиционный вид
В 8 версии C# можно работать не только с int и другими разновидностями информации, но и с различными templates. В соответствующей разработке языка появились позиционные шаблоны. Они используются для деконструкции результирующей записи и сравнения итоговых параметров с заданными вложенными templates.
В позиционном шаблоне допускается использование имен компонентов кортежа и параметров метода Deconstruct. Рассматриваемый компонент расширяется несколькими способами:
- добавлением проверки вида среды выполнения и объявлением переменной (пример – int);
- путем использования шаблона свойств;
- за счет объединения двух предыдущих вариантов.
Соответствующая категория templates class в C# рекурсивная.
Var
Var существует в C# достаточно долго – с 7 версии языка разработки. С его помощью удается сопоставлять любые выражения, включая null, а также присваивать получившиеся результаты новым локальным переменным (пример – int):
Var удобно использовать, когда в логической записи требуется временная переменная. В нее будут записываться временные данные.
Пустая переменная
В C# с версии 8.0 допускается шаблон пустой переменной «_». Он используется для сопоставления всевозможных записей, включая нулевые:
Данный вариант templates не может быть шаблонов в выражении is или операторе switch. Вместо него рекомендуется пользоваться var.
В круглых скобках
В C# 9.0 появилась возможность использования круглых скобок. Соответствующее правило необходимо для того, чтобы корректировать или подчеркивать приоритет логических шаблонов.
Выше – наглядный пример расстановки приоритетов в языке C#.
P. S. Интересует разработка? Обратите внимание на курс «Программист C». Также в Otus доступно множество других современных курсов.