rubyで書くテンプレートメソッドのメモ

テンプレートメソッドとは

 テンプレートメソッドとは、以下の2つのクラスによって構成するデザインパターン

  1. 共通の処理を行う「抽象的なベースのクラス」
  2. 個別の処理を行う「具象的なサブクラス」

どういう時に使うのか

 処理の流れがほとんど同じコードが複数存在し、それらを共通化したい場合に使う。  例えば、apiを使ってブランチをマージする処理をgithub用とgitlab用で作る必要がある場合、2つの処理は以下の共通の流れを辿る。

  1. checkoutする
  2. pullする
  3. マージする対象のブランチを探す
  4. ブランチをマージする
  5. pushする

 上記のような共通処理は、ベースクラスにまとめ、githubとgitlabの違いはサブクラスにまとめて書くのがテンプレートメソッドのデザインパターン

使うメリット

  • 処理の骨子と個別の処理を分けることによって変更すべき箇所がすぐにわかる。
  • コードがすっきりする

具体例:githubとgitlabのapiを使ってブランチをマージするコード

やりたいこと:各gitのホスティングサイトにて、ブランチをマージするjobを作りたい。 前提: - githubとgitlabで実現したい処理の流れは同じ。 - githubとgitlabのapiの仕様が異なるため、「マージ対象のブランチを探すコマンド」だけは別々の処理を書く必要がある。 サンプルコード:

class Merge
  def execute
    checkout
    pull
    target_branch
    merge
    push
  end

  def checkout
    git checkout
  end

  def pull
    git pull
  end

  def target_branch
    raise 'Called abstract method: target_branch'
  end

  def merge
    git merge
  end

  def push
    git push
  end
end

class GitHubMerge < Merge
  def target_branch
    github_api専用の処理
  end
end

class GitLabMerge < Merge
  def target_branch
    gitlab_api専用の処理
  end
end

# 実行
GitHubMerge.new.execute
GitLabMerge.new.execute