Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

コーディングを支える技術

今まで自分なりにプログラミングについて学んできたつもりでしたが、知識は少しずつ増えるものの体系化されていないと感じていました。本書は、

  • 複数の言語を比較することから学ぶ
  • 歴史から学ぶ

という点に力をおいて解説されています。
前者は今まで自分でも経験していた部分ですが、後者の歴史から学ぶは今まであまり意識したことがなくとても新鮮でした。
本書は、自分のように何年も学んできた(つもりの)人が自分の知識をまとめるためにも有効だと思いますが、今からプログラミングを学ぼうとする人が回り道をせず効果的に学ぶための下準備をするために良いのではと感じました。

ところで、「第12章 継承によるコードの再利用」では、名前が衝突したときの振る舞いの例として、以下のようなコードが紹介されています。

module Foo
  def hello
    puts "foo!"
  end
end

module Bar
  def hello
    puts "bar!"
  end
end

class FooBar
  include Foo
  include Bar
end

class BarFoo
  include Bar
  include Foo
end

FooBar.new.hello 
BarFoo.new.hello

モジュールFooとBarの両方にhelloメソッドがあり衝突が起こってますが、Rubyの場合は後からincludeした方が上書きしていますので以下のような実行結果となります。

bar!
foo!

Ruby 2.0になり何か解決法があるのではと思い、「Matzにっき(2010-11-13)」を見るとmixメソッドを導入し名前の重複を検出するとありましたが、結局は導入が見送られたようですね。実はそのことをtwitter上でMatzさんより教えて頂きました。ありがとうございます。

以下のように書くのでしょうか。

module Foo
  def hello
    puts "foo!"
  end
end

module Bar
  def hello
    puts "bar!"
  end
end

class FooBar
  include Foo
  alias_method :foo_hello, :hello
  include Bar
  alias_method :bar_hello, :hello
end

class BarFoo
  include Bar
  alias_method :bar_hello, :hello
  include Foo
  alias_method :foo_hello, :hello
end

FooBar.new.bar_hello
FooBar.new.foo_hello
BarFoo.new.bar_hello
BarFoo.new.foo_hello