Kod kotła - Boilerplate code

W programowaniu komputerowym, boilerplate code lub po prostu boilerplate to sekcje kodu, które powtarzają się w wielu miejscach z niewielką lub żadną zmiennością. Używając języków, które są uważane za pełne , programista musi napisać dużo kodu, aby osiągnąć tylko niewielką funkcjonalność. Taki kod nazywa się boilerplate .

Konieczność używania boilerplate’u może zostać zredukowana poprzez wysokopoziomowe mechanizmy, takie jak metaprogramowanie (w którym komputer automatycznie zapisuje potrzebny kod lub wstawia go w czasie kompilacji ), konwencję nad konfiguracją (która zapewnia dobre wartości domyślne, zmniejszając potrzebę określania programu szczegóły w każdym projekcie) i inżynierię opartą na modelach (która wykorzystuje modele i generatory modelu do kodu, eliminując potrzebę ręcznego kodu wzorcowego).

Początek

Termin wywodzi się z branży prasowej . Kolumny i inne artykuły dystrybuowane przez konsorcja drukarskie wysyłane były do ​​prenumerowanych gazet w postaci przygotowanych klisz drukarskich . Ze względu na ich podobieństwo do metalowych płyt używanych do produkcji kotłów , stały się one znane jako „płyty kotłowe”, a powstały tekst – „tekst płyty kotłowej”. Ponieważ historie rozpowszechniane przez płyty kotłowe były zwykle „ wypełniaczami ”, a nie „poważnymi” wiadomościami, termin ten stał się synonimem nieoryginalnego, powtarzającego się tekstu.

Pokrewnym terminem jest kod księgowy , który odnosi się do kodu, który nie jest częścią logiki biznesowej, ale jest z nią przeplatany w celu aktualizacji struktur danych lub obsługi drugorzędnych aspektów programu.

Preambuła

Jedna z form szablonów składa się z deklaracji, które nie są częścią logiki programu ani podstawowej składni języka , ale są dodawane na początku pliku źródłowego jako kwestia zwyczaju. Poniższy przykład Perla demonstruje boilerplate:

#!/usr/bin/perl
use warnings;
use strict;

Pierwsza linia to shebang , która identyfikuje plik jako skrypt Perla, który można wykonać bezpośrednio z wiersza poleceń (w systemach Unix/Linux). Pozostałe dwie to pragmy włączające ostrzeżenia i tryb ścisły, które są wymagane przez modny Perl styl programowania .

Następnym przykładem jest schemat języka programowania C/C++ , #includeguard .

#ifndef MYINTERFACE_H
#define MYINTERFACE_H

...

#endif

To sprawdza i ustawia flagę globalną, aby poinformować kompilator, czy plik myinterface.h został już dołączony. Ponieważ wiele współzależnych plików może być zaangażowanych w kompilację modułu, pozwala to uniknąć wielokrotnego przetwarzania tego samego nagłówka (co prowadziłoby do błędów z powodu wielu definicji o tej samej nazwie).

W programowaniu obiektowym

W programach zorientowanych obiektowo klasy są często wyposażone w metody pobierania i ustawiania zmiennych instancji. Definicje tych metod często można uznać za schematyczne. Chociaż kod będzie się różnił w zależności od klasy, ma wystarczająco stereotypową strukturę, że lepiej byłby generowany automatycznie niż pisany ręcznie. Na przykład w poniższym Java klasy reprezentującej zwierzaka, prawie cały kod jest boilerplate wyjątkiem deklaracji o Pet , nazwy i właściciela :

Jawa

public class Pet {
    private String name;
    private Person owner;

    public Pet(String name, Person owner) {
        this.name = name;
        this.owner = owner;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getOwner() {
        return owner;
    }

    public void setOwner(Person owner) {
        this.owner = owner;
    }
}

Większość schematów w tym przykładzie ma na celu zapewnienie enkapsulacji . Jeśli zmienne name i owner zostałyby zadeklarowane jako public , metody akcesora i mutatora nie byłyby potrzebne.

Aby zmniejszyć ilość boilerplate’u, powstało wiele frameworków, np. Lombok for Java. Ten sam kod co powyżej jest automatycznie generowany przez Lombok przy użyciu adnotacji Java , co jest formą metaprogramowania :

@AllArgsConstructor
@Getter
@Setter
public class Pet {
    private String name;
    private Person owner;
}

Scala

W niektórych innych językach programowania może być możliwe osiągnięcie tego samego przy mniejszej ilości szablonów, gdy język ma wbudowaną obsługę takich typowych konstrukcji. Na przykład odpowiednik powyższego kodu Javy można wyrazić w Scali za pomocą tylko jednej linii kodu:

case class Pet(var name: String, var owner: Person)

C#

Lub w C# przy użyciu właściwości automatycznych z polami zapasowymi generowanymi przez kompilator:

public class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

Schemat metody

Oprócz deklaracji, metody w językach OOP również przyczyniają się do ilości boilerplate’u. Badanie z 2015 r. dotyczące popularnych projektów Java pokazuje, że 60% metod można jednoznacznie zidentyfikować po wystąpieniu 4,6% ich tokenów, co sprawia, że ​​pozostałe 95,4% schematu nie ma związku z logiką. Naukowcy są przekonani, że wynik ten przełożyłby się na podprogramy w językach proceduralnych w ogóle.

HTML

W HTML następujący szablon jest używany jako podstawowy pusty szablon i występuje na większości stron internetowych:

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

</body>
</html>

WHATWG HTML Living standard określa, że <html>, <head>i <body>znaczniki mogą być bezpiecznie pominięte w większości przypadków. <meta charset="UTF-8">Tag jest technicznie zbędny gdy przychodzi bezpośrednio z serwera WWW skonfigurowany do wysyłania kodowanie znaków w nagłówku HTTP, choć staje się przydatna, gdy odpowiedź HTML jest zapisany w .htmlpliku, cache, lub archiwum internetowego. Przewodnik po stylu HTML/CSS Google zaleca pominięcie wszystkich opcjonalnych tagów, co skutkuje znacznie mniejszą ilością szablonów. World Wide Web Consortium wskazuje, że element ten <title>nie może być puste:

<!DOCTYPE html>
<title>Test</title>

Zobacz też

Bibliografia