alias を使った Adapter パターン

ruby には alias 式でメソッド、演算子グローバル変数正規表現後方参照の別名を作ることができるようです。Adapter パターンRuby っぽくするために alias を使って書き替えてみます。

#!/usr/local/bin/ruby

class Banner
  def initialize(string)
    @string = string
  end

  def show_with_paren
    puts "(#@string)"
  end

  def show_with_aster
    puts "*#@string*"
  end
end

class PrintBanner < Banner
  alias print_weak show_with_paren
  alias print_strong show_with_aster
end

p = PrintBanner.new("Hello")
p.print_weak
p.print_strong

これでうまくいきました。元のコードが Banner#show_with_paren を PrintBanner#print_weak に委譲しているだけだったので alias を使ってみた、というものです。

わざわざ PrintBanner を用意しなくても

class Banner
  alias print_weak show_with_paren
  alias print_strong show_with_aster
end

でも良いかもしれません。後からいくらでもクラスの挙動を変えられるのが動的言語の良いところです。

ところでこの alias、文法的には「新しい名前 古い名前」の順ですが、なんとなく逆の方が直感的な気がします。しかしこの順になっているのは UNIX の alias コマンドを意識しているからなのでしょうか。