Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

テンプレートの抽出

臭い名

繰り返しタイピング

臭い英名

repetition typing

臭い状況

日々のコーディング、設定ファイル等テキストファイルの編集時に
繰り返し似たような構造のテキストをタイプしている。

パターン名

テンプレートの抽出

パターン英名

extract template

改善理由

・タイプ時間を短くします
・長いタイピングによるミスを減らします
・定型フォーマットを利用することでテキストのフォーマットが統一されます
・テンプレートをチームメンバーと共有することで効率化の範囲が広がります

対応

テンプレート機能に対応しているIDE、エディタを利用していることを前提に、
定型文をテンプレート化する。

例えばEclipseのコードテンプレートやSublime Text2のスニペット機能。

チームに配布する場合は、テンプレートをエクスポートして共有する。

この機能の有無はエディタ選定の基準にもなる。

サンプル

下記の記事で作成した標準出力用共通モジュールを頻繁に使うとします
Ruby | 標準入出力処理時のValidationをクラスマクロで共通化
http://d.hatena.ne.jp/tbpg/20130625/1372165415

利用例

class YenDollar
  include StandardIo
  validate_args_counts 1
  validate_us_dollar 0

  def yd_rate
    uri = "http://stocks.finance.yahoo.co.jp/stocks/detail?code=USDJPY=X"
    page = URI.parse(uri).read

    document = Nokogiri::HTML(page, uri)
    document.xpath('//td[@class="stoksPrice"]').text
  end
end

上記のようなコードを繰り返し利用する場合にスニペットを作成することで一瞬でコーディングが完了します。
今回はSublime Text2のスニペットを作成してみます。

<snippet>
  <content><![CDATA[
class ${1:class_name}
  include StandardIo
  # use validator=>un-comment. unuse validator=>clear line.
  # validate_args_counts 0
  # validate_us_dollar 0
  # validate_file 0

  # define method
  def ${2:method_name}(${3:method_param})
    ${0:method_contents}
  end
end
]]></content>
  <tabTrigger>stdio</tabTrigger>
  <scope>source.ruby</scope>
  <description>use standerd io module</description>
</snippet>

備考

下記は類似したケースに対応するテクニックのためそれぞれの利点・欠点に応じた取捨選択が必要

・コードテンプレートの利用
あくまで人間がコーディングせざるを得ない繰り返し構造をテンプレート化する。
そもそもジェネレーターにしたりメタプログラミングDSL化できるならタイピングすらする必要がなくなるため
そちら側で対応する。
・コードジェネレーターの作成
スニペットでは対応できないような複雑な条件を元にテンプレートとなるコードを生成する必要が
ある場合にこちらを使用する。
メタプログラミング機能の弱い静的言語にメタな機能を持たせる代わりに動的言語で静的言語をジェネレートするのも有効。
・繰り返し利用する用語の辞書登録
完全に固定の文字列を利用する場合や、ツール間をまたいで利用したいワード・パターンがある場合に利用。
途中に値を差し込んだり,フォーカスの制御などが必要であればテンプレート機能を利用する。
メタプログラミングによるコード生成
Javaなど静的言語の場合はメタプログラミングの制限が多く、ジェネレーターに依存する状況が多いが
スクリプト言語を利用する場合に自言語を生成するならジェネレーターにするよりもメタプログラミングDSLにより
機能に組み込んだ方が生産性が上がる。