В компьютерном программировании шаблонный код или просто шаблонный код — это разделы кода, которые повторяются в нескольких местах с небольшими вариациями или без них. При использовании языков, которые считаются многословными , программист должен писать много шаблонного кода, чтобы выполнить лишь незначительную функциональность. [1]
Необходимость в шаблонном коде можно сократить с помощью высокоуровневых механизмов, таких как метапрограммирование (которое позволяет компьютеру автоматически писать необходимый шаблонный код или вставлять его во время компиляции ), соглашение о конфигурации (которое предоставляет хорошие значения по умолчанию, что снижает необходимость указывать детали программы в каждом проекте) и проектирование на основе моделей (которое использует модели и генераторы кода-модели, что устраняет необходимость в ручном шаблонном коде).
Также возможно переместить шаблонный код в абстрактный класс , чтобы его могли наследовать любые конкретные классы . Другим вариантом было бы переместить его в подпрограмму, чтобы его можно было вызывать вместо дублирования.
Термин возник из газетного бизнеса. Колонки и другие части, которые распространялись печатными синдикатами , отправлялись в подписные газеты в виде готовых печатных форм . Из-за их сходства с металлическими пластинами, используемыми при изготовлении котлов , они стали известны как «котельные пластины», а их результирующий текст — «шаблонный текст». Поскольку истории, которые распространялись котельными пластинами, обычно были « заполнителями », а не «серьёзными» новостями, термин стал синонимом неоригинального, повторяющегося текста. [2] [3]
Связанный термин — бухгалтерский код , относящийся к коду, который не является частью бизнес -логики , но перемежается с ней для поддержания актуальности структур данных или обработки второстепенных аспектов программы.
Одна из форм шаблона состоит из объявлений, которые, хотя и не являются частью логики программы или основного синтаксиса языка , добавляются в начало исходного файла по обычаю. Следующий пример Perl демонстрирует шаблон:
#!/usr/bin/perl использовать предупреждения ; использовать строгий ;
Первая строка — это shebang , который идентифицирует файл как скрипт Perl, который может быть выполнен непосредственно в командной строке в системах Unix/Linux. Две другие — это прагмы, включающие предупреждения и строгий режим, которые предписаны модным стилем программирования Perl .
Следующий пример представляет собой шаблон языка программирования C/C++ , #include
guard .
#ifndef МОЙИНТЕРФЕЙС_H #define МОЙИНТЕРФЕЙС_H...#endif
Это проверяет и устанавливает глобальный флаг, сообщающий компилятору, был ли уже включен файл myinterface.h. Поскольку в компиляцию модуля может быть вовлечено много взаимозависимых файлов, это позволяет избежать многократной обработки одного и того же заголовка (что может привести к ошибкам из-за нескольких определений с одним и тем же именем).
В программах Java классы DTO часто предоставляются с методами для получения и установки переменных экземпляра. Определения этих методов часто можно рассматривать как шаблон. Хотя код будет отличаться от класса к классу, он достаточно стереотипен по структуре, чтобы его было лучше генерировать автоматически, чем писать вручную. Например, в следующем классе Java , представляющем домашнее животное, почти весь код является шаблонным, за исключением объявлений Pet , name и owner :
public class Pet { private String name ; private Person owner ; public Pet ( Имя строки , Владелец человека ) { this.name = имя ; this.owner = владелец ; } public String getName () { return name ; } public void setName ( имя строки ) { this.name = имя ; } public Person getOwner () { return owner ; } public void setOwner ( Person owner ) { this . owner = owner ; } }
Большая часть шаблона в этом примере существует для выполнения требований JavaBeans . Если бы имя переменной и владелец были объявлены как public , методы доступа и мутатора не понадобились бы.
В Java 14 для борьбы с этой проблемой были добавлены классы записей. [4] [5] [6]
Чтобы сократить количество шаблонного кода, было разработано много фреймворков, например Lombok для Java. [7] Тот же код, что и выше, автоматически генерируется Lombok с использованием аннотаций Java , что является формой метапрограммирования :
@AllArgsConstructor @Getter @Setter public class Pet { private String name ; private Person owner ; }
В некоторых других языках программирования можно достичь того же самого с меньшим количеством шаблонов, когда язык имеет встроенную поддержку для таких общих конструкций. Например, эквивалент приведенного выше кода Java может быть выражен в Scala с помощью всего одной строки кода:
класс случая Pet ( имя переменной : String , владелец переменной : Person )
Или в C# с использованием автоматических свойств с резервными полями, сгенерированными компилятором:
public class Pet { public string Name { get ; set ; } public Person Owner { get ; set ; } }
Начиная с C# 9.0 появилась возможность использовать записи, которые автоматически генерируют классы со свойствами:
публичная запись Домашнее животное ( строка Имя , Лицо Владелец );
Помимо деклараций, методы в языках ООП также вносят свой вклад в количество шаблонов. Исследование 2015 года популярных проектов Java показывает, что 60% методов можно однозначно идентифицировать по появлению 4,6% их токенов, что делает оставшиеся 95,4% шаблонов нерелевантными для логики. Исследователи полагают, что этот результат можно перенести на подпрограммы в процедурных языках в целом. [8]
В HTML следующий шаблон используется как базовый пустой шаблон и присутствует на большинстве веб-страниц:
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" /> < title > Тест </ title > </ head > < body ></ тело > </ html >
WHATWG HTML Living Standard определяет, что теги<html>
, <head>
и <body>
могут быть безопасно опущены в большинстве случаев. [9] Тег технически избыточен, когда поступает напрямую с веб-сервера, настроенного на отправку кодировки символов в заголовке HTTP, хотя он становится полезным, когда ответ HTML сохраняется в файле, кэше или веб-архиве. [10] Руководство по стилю HTML/CSS от Google рекомендует опускать все необязательные теги, [11] что приводит к гораздо меньшему количеству шаблонов. Консорциум Всемирной паутины утверждает, что элемент не должен быть пустым: [12]<meta charset="UTF-8">
.html
<title>
<!DOCTYPE html> < title > Тест </ title >
В Python следующий шаблонный код можно использовать для изменения того, может ли код выполняться только в контексте модуля или вне его.
если __name__ == '__main__' : # Все, что здесь размещено, никогда не будет выполнено в контексте модуля. passесли __name__ != '__main__' : # Все, что здесь размещено, будет выполнено только в контексте модуля. pass