BashでStrategyパターン

デザインパターンオブジェクト指向言語だけのものではない。シェルスクリプトにもデザインパターンの概念は適用可能です。

Strategyパターンとは、アルゴリズムを動的に付け替えることができるデザインパターンです。

f:id:fjkz:20160408185448p:plain

この概念は決してオブジェクト指向だけのものではありません。Cでもコールバック関数という形で実現することができます。

シェルスクリプトであっても、処理を動的に付け替えるコマンドを作ることができます。例えば、

  • exec
  • nohup
  • chroot
  • time
  • strace

などのコマンドは引数に指定されたコマンドで動きが変わります。Strategyパターンと同じ発想と言えると思います。

こういうコマンドを引数に取るようなコマンドを作ると便利なことが多い。例えば、前処理と後処理を共通化したいときに有効かと思われる。

以下は例。

function do_between_before_after() {
  # trapが効くように()で囲む
  (
    # 前処理
   echo 'BEFORE'

    # 後処理
    trap "
      exit_code=$?
      echo 'AFTER'
      exit ${exit_code}
    " EXIT HUP INT QUIT TERM

    "$@"
  )
}

実行すると以下のように前処理と後処理が行われる。

$ do_between_before_after echo DO
BEFORE
DO
AFTER