Шаблонный код

Шаблонный код, boilerplate-код (англ. boilerplate code) — нетворческий программный код, который программисту приходится писать вследствие требований языка программирования, операционной системы, библиотеки подпрограмм, манеры программирования и прочего. Название «шаблонный» говорит, что он повторяется из функции в функцию, из программы в программу с минимальными изменениями. Шаблонными, в числе прочего, будут:

  • подключение модулей;
  • настройка компилятора и/или системы сборки;
  • организация точки входа в программу или подпрограмму;
  • код инициализации и выхода.

Например, в простейшем «Hello, world» на Си все строки, кроме собственно printf(...), будут шаблонными.

#include <stdio.h>                    //< шаблонный — подключение модуля
int main()                            //< шаблонный — точка входа
{                                     //< шаблонный — точка входа
  printf("Hello, world!\n");          //< творческий!!
  return 0;                           //< шаблонный — выход
}                                     //< шаблонный — точка входа

К шаблонному коду близок так называемый bookkeeping code — творческий, но сравнительно простой код, обеспечивающий дополнительные стороны функционирования программы наподобие загрузки-сохранения.

Этимология понятия «boilerplate»

Слово «boilerplate» по-английски означает «котельное железо». Применительно к шаблонному тексту встречается уже в 1950-х. Этимология неясна и определённо происходит из лексикона полиграфистов, основные версии:

  1. Местные американские газеты подписывались на получение новостей у крупных печатных синдикатов, и те присылали их в виде готовых заметок на отлитых печатных формах. Эти формы и называли «котельным железом»[1][2].
  2. Печатные формы, которые нужны были многократно в нескольких выпусках газеты — для газетных шапок, объявлений от постоянных клиентов и т. д. — делали из стали, в то время как основная часть газеты набиралась из свинцового сплава[3].
  3. Дымогарный котёл требовал сверления множества отверстий, в которые вставляли дымогарные трубы. Для сверления использовали пластины-шаблоны, и написание стандартных объявлений сравнили с шаблонным сверлением отверстий[4][5].

Методы уменьшения количества шаблонного кода

Системы и библиотеки, решающие вопрос

Стандартный код на Java:

public class Book {
    private String m_ISBN;
    private String m_Title;
    private String m_SubTitle;
    private String m_Autor;

    public String getISBN() { return m_ISBN; }
    public void setISBN(String pISBN) { m_ISBN = pISBN; }

    public String getTitle() { return m_Title; }
    public void setTitle(String pTitle) { m_Title = pTitle; }

    public String getSubTitle() { return m_SubTitle; }
    public void setSubTitle(String pSubTitle) { m_SubTitle = pSubTitle; }

    public String getAutor() { return m_Autor; }
    public void setAutor(String pAutor) { m_Autor = pAutor; }
}

Аналогичный код на C#

public class Book
{
    public string ISBN { get; set; }
    public string Title { get; set; }
    public string SubTitle { get; set; }
    public string Autor { get; set; }
}

…и на Kotlin

data class Book(var ISBN: String, var Title: String, var SubTitle: String, var Autor: String)

Стоит сказать, что языки программирования стараются избавляться от шаблонного кода. Примером может быть 17 версия Java, в которой появился специальный тип record, позволяющий писать меньше кода, подобно Kotlin

public record Book(String m_ISBN, String m_Title, String m_SubTitle, String m_Autor) {
}

Автогенераторы кода

Например, в системе Qt Widgets код минимальной формы с кнопкой состоит из нескольких файлов, приведём один.

//== FmMain.cpp ==
#include "FmMain.h"
#include "ui_FmMain.h"

FmMain::FmMain(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::FmMain)
{
    ui->setupUi(this);
}

FmMain::~FmMain()
{
    delete ui;
}


void FmMain::on_btDemo_clicked()
{
    ui->btDemo->setText("Demo!!");    //< Только эту строку мы пишем вручную!
}

При этом только одну строку программист пишет вручную.

Адекватные настройки по умолчанию

Пример 1. В Qt+MinGW для создания автономной консольной программы под Windows надо сделать:

win32-g++ {
    QMAKE_CXXFLAGS += -static-libgcc -static-libstdc++
    LIBS += -static -lpthread
}

Это также считается шаблонным кодом. Поскольку мелкие учебные и экспериментальные программы обычно являются автономными и консольными, возможно, следовало бы добавлять подобный код всегда при создании пустой консольной программы — а разработчик более сложного ПО, использующего чужие динамические библиотеки, просто стирал бы его.

Пример 2. Полный HTML выглядит так:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <title>Test</title>
</head>
<body>
  <p>Hello world!</p>
</body>
</html>

Стандарт WHATWG HTML позволяет опустить html, head и body[6]. Meta charset можно опустить, если HTML пришёл от сервера и в заголовках HTTP есть кодировка. Так что остаётся…

<!DOCTYPE html>
<title>Test</title>
<p>Hello world!</p>

Пример 1. В том же Qt есть две программы, создающие часть Си++-кода формы — метаобъектный компилятор (moc) и компилятор интерфейса (uic).

Пример 2. Создание копии объекта с учётом умных указателей Си++11 выглядит так.

#include <iostream>
#include <memory>

class Abstract {
public:
    auto clone() const { return std::unique_ptr<Abstract>{ vclone() }; }
protected:
    virtual Abstract* vclone() const = 0;
};

class Abstract2 : public Abstract {
public:
    auto clone() const { return std::unique_ptr<Abstract2>{ vclone() }; }
protected:
    virtual Abstract2* vclone() const = 0;
};

class Concrete : public Abstract2 {
public:
    auto clone() const { return std::unique_ptr<Concrete>{ vclone() }; }
protected:
    Concrete* vclone() const override { return new Concrete(*this); }
};

int main()
{
    Concrete impl;

    Abstract* a = &impl;
    std::unique_ptr<Abstract> b = a->clone();
    std::unique_ptr<Concrete> c = impl.clone();

    return 0;
}

Здесь шаблонный код — реализации функций vclone и clone.

С препроцессором Си этот код будет выглядеть так, и чем больше классов в иерархии, тем больше выигрыш:

#define IMPL_CLONE_1(Class, Body)  \
    public:     auto clone() const { return std::unique_ptr<Class>{ vclone() }; } \
    protected:  virtual Class* vclone() const Body

#define IMPL_CLONE_ABSTRACT(Class) IMPL_CLONE_1(Class, override = 0;)
#define IMPL_CLONE_CONCRETE(Class) IMPL_CLONE_1(Class, override { return new Class(*this); })

class Abstract {
    IMPL_CLONE_1(Abstract, =0;)
};

class Abstract2 : public Abstract {
    IMPL_CLONE_ABSTRACT(Abstract2)
};

class Concrete : public Abstract2 {
    IMPL_CLONE_CONCRETE(Concrete)
};

На Си++ обрезка пробелов (trim) в строках разного типа «на месте» (без выделения памяти) будет выглядеть так:

std::string_view trimSv(std::string_view x) {
  // Какая-то реализация
}

std::wstring_view trimSv(std::wstring_view x) {
  // Похожая реализация
}

И то же с метапрограммированием:

namespace detail {
  template <class Ch, class Traits>
  std::basic_string_view<Ch, Traits> trimSv(std::basic_string_view<Ch, Traits> x) {
    // Реализация
  }
}

template <class S>
inline auto trimSv(const S& x)
  { return detail::trimSv(static_cast<std::basic_string_view>(x)); }

Код также многословный (вторая функция нужна, чтобы под шаблон подходил не только std::string_view, но и близкие к нему типы std::string и const char*), но как минимум без повторов.

Примечания

  1. Источник. Дата обращения: 9 февраля 2022. Архивировано 9 февраля 2022 года.
  2. Boilerplate Definition & Meaning — Merriam-Webster. Дата обращения: 9 февраля 2022. Архивировано 14 декабря 2021 года.
  3. Why is it «Boilerplate text?» | Mental Floss
  4. What is the origin of the term 'boilerplate'? — Quora
  5. Boilerplate Definition. Дата обращения: 9 февраля 2022. Архивировано 9 февраля 2022 года.
  6. HTML Standard. Дата обращения: 12 ноября 2022. Архивировано 26 сентября 2021 года.

Read other articles:

Artikel ini bukan mengenai Crazy Love. Crazy LovePoster filmSutradaraGuntur SoeharjantoProduserOdy Mulya Hidayat[1]Ditulis olehAlim Sudio Cassandra MassardiPemeranAdipati Dolken Tatjana Saphira Kemal Palevi Herichan Zidni Adam Putri Una Ira Wibowo Harry de Fretes Ray Sahetapy JudikaPerusahaanproduksiMaxima PicturesDistributorMaxima PicturesFalcon PicturesTanggal rilis22 Agustus 2013 (2013-08-22)Durasi90 menitNegaraIndonesiaBahasaBahasa Indonesia Crazy Love adalah film drama Indon...

 

1993–94 FIS Cross-Country World CupDiscipline Men WomenOverall Vladimir Smirnov (2nd title) Manuela Di CentaNations Cup Norway RussiaNations Cup Overall NorwayCompetitionLocations 9 venues 9 venuesIndividual 13 events 13 eventsRelay/Team 6 events 6 events ←1992–931994–95→ The 1993–94 FIS Cross-Country World Cup was the 13th official World Cup season in cross-country skiing for men and women. The season began in Santa Caterina, Italy, on 11 December 1993 and finished in Thunder Bay...

 

Provinsi dan kota otonom di Argentina Argentina terbagi menjadi 23 provinsi (bahasa Spanyol: provincias, tunggal - provincia) dan sebuah kota otonom (ciudad autónoma), yaitu Buenos Aires yang merupakan ibu kota federal (Capital Federal) negara itu berdasarkan keputusan Kongres Nasional. Masing-masing provinsi termasuk ibu kota federal memiliki konstitusi mereka sendiri, tetapi berada di bawah sistem federal. Sejarah Pada tahun 1853, tiga belas provinsi yakni Catamarca, Córdoba, Corrientes, ...

Artikel atau bagian artikel ini kemungkinan telah disalin dan disisipkan bulat-bulat dari https://sajogyo-institute.org/pudjiwati-sajogyo/, dan mungkin melanggar kebijakan hak cipta Wikipedia. Silakan perbaiki artikel ini dengan menghapus konten berhak cipta tidak bebas dan menggantinya dengan konten bebas dengan benar, atau tandai konten untuk dihapus. (periksa) (Februari 2023) Artikel ini membutuhkan rujukan tambahan agar kualitasnya dapat dipastikan. Mohon bantu kami mengembangkan artikel ...

 

ماربلتاون   الإحداثيات 41°51′12″N 74°09′21″W / 41.853333333333°N 74.155833333333°W / 41.853333333333; -74.155833333333   [1] تاريخ التأسيس 1669  تقسيم إداري  البلد الولايات المتحدة[2][3]  التقسيم الأعلى مقاطعة أولستر  خصائص جغرافية  المساحة 55.18 ميل مربع  ارتفاع 255 متر...

 

German cultural region in the State of Missouri Not to be confused with Rhineland, Missouri. Region of Missouri in the United StatesMissouri Rhineland Missouri Rheinland (German)Region of MissouriThe Gasconade Courthouse in Hermann, Missouri Rhineland FlagState of MissouriCountryUnited StatesStateMissouriDemonym(s)Missouri Rhinelanders, (German: Missouri Rheinländer) The Rhineland in the early 1800s The Missouri Rhineland is a German cultural region of Missouri that extends from west of...

Steam power plant in Manhattan, New York IRT PowerhouseFacade of the powerhouse on Eleventh AvenueGeneral informationTypeSteam power plantArchitectural styleRenaissance RevivalAddress855–869 Eleventh AvenueTown or cityNew York CityCountryUnited StatesCoordinates40°46′19″N 73°59′32″W / 40.77194°N 73.99222°W / 40.77194; -73.99222Construction started1902Completed1905OpenedOctober 27, 1904OwnerConsolidated EdisonDimensionsOther dimensions500 feet (150 m)...

 

Voce principale: Macerata. Sindaco di Macerata TipoSindaco In caricaSandro Parcaroli (LN) da24 settembre 2020 Eletto daCittadini di Macerata Ultima elezione20-21 settembre 2020 Prossima elezione2025 Durata mandato5 anni SedePalazzo del Municipio IndirizzoPiazza della Libertà, 3 Sito webwww.comune.macerata.it Modifica dati su Wikidata · Manuale Di seguito l'elenco cronologico dei sindaci di Macerata e delle altre figure apicali equivalenti che si sono succedute nel corso della storia.&...

 

Medical Examiner's Office, LA County, California, United States of America This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Los Angeles County Department of Medical Examiner – news · newspapers · books · scholar · JSTOR (December 2009) (Learn how and when to remove this message) Los Angeles County Department ...

Pedro Pascal al San Diego Comic-Con 2017 Pedro Pascal, all'anagrafe José Pedro Balmaceda Pascal (AFI: [xoˈse ˈpeðɾo βalmaˈseða pasˈkal]; Santiago del Cile, 2 aprile 1975), è un attore cileno naturalizzato statunitense.[1] È principalmente noto per aver interpretato Oberyn Martell nell'acclamata serie televisiva Il Trono di Spade (2014), Javier F. Peña nella serie crime Narcos (2015-2017), il Mandaloriano nella serie spin-off di Guerre stellari The Mandalorian (2019-2023) J...

 

У этого термина существуют и другие значения, см. Чайки (значения). Чайки Доминиканская чайкаЗападная чайкаКалифорнийская чайкаМорская чайка Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:Вторич...

 

  「俄亥俄」重定向至此。关于其他用法,请见「俄亥俄 (消歧义)」。 俄亥俄州 美國联邦州State of Ohio 州旗州徽綽號:七葉果之州地图中高亮部分为俄亥俄州坐标:38°27'N-41°58'N, 80°32'W-84°49'W国家 美國加入聯邦1803年3月1日,在1953年8月7日追溯頒定(第17个加入联邦)首府哥倫布(及最大城市)政府 • 州长(英语:List of Governors of {{{Name}}}]]) •&...

هنودمعلومات عامةنسبة التسمية الهند التعداد الكليالتعداد قرابة 1.21 مليار[1][2]تعداد الهند عام 2011ق. 1.32 مليار[3]تقديرات عام 2017ق. 30.8 مليون[4]مناطق الوجود المميزةبلد الأصل الهند البلد الهند  الهند نيبال 4,000,000[5] الولايات المتحدة 3,982,398[6] الإمار...

 

Voce principale: Unione Sportiva Sambenedettese 1923. Società Sportiva Sambenedettese CalcioStagione 2007-2008Sport calcio Squadra Sambenedettese Allenatore Guido Ugolotti, poi Enrico Piccioni, poi Enzo Scarpantoni, poi Enrico Piccioni, poi Guido Ugolotti Presidente Giovanni Tormenti Serie C111º posto nel girone B. Maggiori presenzeCampionato: Morini (32) Miglior marcatoreCampionato: Curiale (9) 2006-2007 2008-2009 Si invita a seguire il modello di voce Questa pagina raccoglie le info...

 

2011 video gameGatling GearsDeveloper(s)Vanguard GamesPublisher(s)Electronic ArtsVanguard Games (PC)Platform(s)Microsoft Windows, Xbox 360, PlayStation 3ReleaseXbox 360WW: May 11, 2011PlayStation 3WW: June 28, 2011Microsoft WindowsWW: August 30, 2011Genre(s)Multi-directional shooter Gatling Gears is a shooter video game developed by Vanguard Games and published by Electronic Arts. In the game, players control dieselpunk mechs from an isometric perspective to destroy waves of enemies.[1 ...

Edward Hobart SeymourEdward Hobart SeymourNascitaKinwarton, 30 aprile 1840 MorteMaidenhead, 2 marzo 1929 Dati militariPaese servito Regno Unito Forza armata Royal Navy Anni di servizio1872 - 1919 GradoAmmiraglio GuerreGuerra di CrimeaRibellione dei Boxer DecorazioniCavaliere di Gran Croce dell'Ordine del Bagno Ordine al Merito voci di militari presenti su Wikipedia Manuale Sir Edward Hobart Seymour (Kinwarton, 30 aprile 1840 – Maidenhead, 2 marzo 1929) è stato un ammi...

 

William Cullen BryantDari kartu kabinet Bryant, c. 1876PekerjaanPenyair, jurnalis, dan penyuntingKebangsaanAmerika SerikatKarya terkenalThanatopsisTanda tangan Portal Sastra William Cullen Bryant (3 November 1794 – 12 Juni 1878) adalah seorang penyair romantis, jurnalis, dan penyunting ulung New York Evening Post. The Embargo, sebuah serangan tajam terhadap Presiden Thomas Jefferson ditebritkan tahun 1808 dan merefleksikan pandangan politik Federalis Dr. Bryant. Bry...

 

خرسانة مسلحةمعلومات عامةالنوع مادة مركبة المكتشف / المخترع Joseph Monier (en) تاريخ الاكتشاف / الاختراع 1853 تعديل - تعديل مصدري - تعديل ويكي بيانات جسر من الخرسانة المسلحة على الطريق السيار شرق-غرب بالجزائر. ابتدأ استعمال هذه الخرسانة المسلحة[1] في حوالي عام 1900، حيث استعملت في اط�...

Aspect of the pandemic COVID-19 pandemic in the British Indian Ocean TerritoryDiseaseCOVID-19Virus strainSARS-CoV-2LocationBritish Indian Ocean TerritoryFirst outbreakWuhan, Hubei, ChinaArrival dateNovember 2020Confirmed cases5[1][2]Suspected cases‡0Recovered2Deaths0‡Suspected cases have not been confirmed by laboratory tests as being due to this strain, although some other strains may have been ruled out. Part of a series on theCOVID-19 pandemicin the United Kingdom, Brit...

 

SenegalJulukanLes Lions de la Teranga(Lions of Teranga)AsosiasiFédération Sénégalaise de Football (FSF)KonfederasiCAF (Afrika)Sub-konfederasiWAFU (Afrika Barat)Pelatih Aliou CissèKaptenKalidou KoulibalyPenampilan terbanyakIdrissa Gueye (111)Pencetak gol terbanyakSadio Mané (43)Stadion kandangStadion Olimpiade DiamniadioKode FIFASENPeringkat FIFATerkini 17 (4 April 2024)[1]Tertinggi18 (Oktober 2022, Juni 2023)Terendah99 (Juni 2013)Peringkat EloTerkini 29 6 (19 Januari 2024)[2...