ボイラープレートコード

ボイラープレートコード (: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。冗長な言語を使用する場合、プログラマーはコードを少しだけ書くだけでも多くのコードを作成する必要がある。このような定型コードはボイラープレートと呼ばれる[1]

必要な定型コードの量は、メタプログラミング設定より規約モデル駆動型エンジニアリングのような高レベルのメカニズムを使うことで低減できる。メタプログラミングでは、コンピュータが自動的に必要な定型コードを書くか、それをコンパイル時に自動的に挿入する。設定より規約では、適切な既定値の設定により、すべてのプロジェクトでプログラムの詳細を記述しなくても良いようにするアプローチである。モデル駆動形エンジニアリングは、モデルとモデル/コードジェネレーターを使用し、手動のボイラープレートコードの必要性を排除する方法である。

語源

[編集]

この用語は新聞業界から生まれた。印刷シンジケーションによって配布するコラムや作品は、あらかじめ準備された印刷版の形で各新聞社に送られた。これは、ボイラーの製造に使用される金属板に類似しているため、「ボイラープレート」と呼ばれ、そこから作られる文章は「ボイラープレートテキスト」と呼ばれるようになった。そして、ボイラープレートは、オリジナルではない繰り返しのテキストと同義になった[2][3]

前文

[編集]

ボイラープレートの1つの形式は、プログラムロジックや言語の基本的な構文の一部ではないが、カスタムの問題としてソースファイルの先頭に追加される宣言で構成される。次のPerlの例は、定型文を示している。

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

最初の行はシバンで、UNIX/Linuxシステムの場合、ファイルをコマンドラインで直接実行できるPerlスクリプトとして識別される。他の2つは、警告と厳密モードをオンにするプラグマであり、Perlプログラミング作法によって義務付けられている。

次の例は、C/C++プログラミング言語の定型文である#includeである。

#ifndef MYINTERFACE_H 
#define MYINTERFACE_H

...

#endif

これにより、myinterface.hがすでに含まれているかどうかをコンパイラに通知するグローバルフラグがチェックされ、設定される。モジュールのコンパイルには多くの相互依存ファイルが関係しているため、これにより、同じヘッダーを複数回処理する必要がなくなる。ただし、同じ名前の複数の定義が原因でエラーが発生する可能性はある。

オブジェクト指向プログラミング

[編集]

オブジェクト指向プログラミングでは、多くの場合、クラスにはインスタンス変数を取得、設定するためのメソッドが提供される。これらの定義は、定型文と見なされる。コードはクラスごとに異なるが、構造は決まりきっているため、手動で記述するよりも自動的に生成する方が適切である。たとえば、ペットを表す次のJavaクラスでは、Petname 、およびownerの宣言を除いて、ほとんどすべてのコードが定型文である。

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;
  }
}

この例のボイラープレートの殆どは、カプセル化のために存在する。変数nameownerがpublicとして宣言されている場合、アクセサメソッドミューテーターメソッドは必要ない。

ボイラープレートの量を減らすために、 JavaならばLombokのようなフレームワークが開発されている[4]。 上記と同じコードは、メタプログラミングの形式であるJavaアノテーションを使用してLombokによって自動生成される。

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

他のいくつかのプログラミング言語では、その言語にそのような一般的な構造のサポートが組み込まれている場合、より少ない定型文で同じことを達成できる可能性がある。たとえば、上記のJavaコードに相当するものは、1行のコードを使用してScalaで表現できる。

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

または、 C#では、コンパイラによって生成されたバッキングフィールドで自動プロパティを使用する。

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

メソッドボイラープレート

[編集]

宣言に加えて、OOP言語のメソッドも定型文の量に影響する。人気のあるJavaプロジェクトに関する2015年の調査によると、メソッドの60%は、トークンの4.6%の出現によって一意に識別でき、残りの95.4%の定型文はロジックとは無関係である。研究者たちは、この結果が一般に手続き型言語のサブルーチンに変換されると信じている[5]

HTML

[編集]

HTMLでは、次の定型文が基本的な空のテンプレートとして使用され、ほとんどのWebページに存在する。

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

</body>
</html>

WHATWG HTML Living Standardは、<html><head>、および<body>タグはほとんどの状況で安全に省略できると定義している[6]<meta charset="UTF-8">タグは、コンテンツタイプとともに文字エンコードを送信するようにWebサーバーが適切に構成されている場合にも省略できる[7]GoogleのHTML/CSSスタイルガイドでは、オプションのタグをすべて省略することを推奨している[8]。その結果、ボイラープレートがはるかにコンパクトになる。

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

関連項目

[編集]

脚注

[編集]
  1. ^ Lämmel, Ralf; Jones, Simon Peyton (2003). “Scrap your boilerplate: a practical design pattern for generic programming”. Proceedings of the 2003 ACM SIGPLAN International Workshop on Types in Languages Design and Implementation. TLDI '03. New York: ACM. pp. 26–37. doi:10.1145/604174.604179. ISBN 9781581136494. https://www.researchgate.net/publication/221282345 
  2. ^ Boilerplate”. Dictionary.com. 2018年1月27日閲覧。
  3. ^ Boilerplate” (英語). Merriam-Webster. 2018年1月27日閲覧。
  4. ^ Frankel (2009年12月7日). “Lombok reduces your boilerplate code”. DZone.com. 2017年8月2日閲覧。
  5. ^ Martin Velez; Dong Qiu (5 February 2015). "On the Lexical Distinguishability of Source Code [was: A Study of "Wheat" and "Chaff" in Source Code]". arXiv:1502.01410 [cs]。
  6. ^ HTML Standard - The HTML syntax - Optional tags”. WHATWG (2017年5月5日). 2017年5月5日閲覧。
  7. ^ Is the charset meta tag required with HTML5?”. stackoverflow.com. 2017年5月5日閲覧。
  8. ^ Google HTML/CSS Style Guide” (英語). google.github.io. 2017年5月5日閲覧。