2005-08-04
■[Ruby] にゃーと鳴いたら猫。わんと鳴いたら犬。 
Matzにっき(2004-10-06)にまつもとさんのコーディングスタイルが書いてあります。
この中の
kind_of?やisa?を使わない。DuckTyping推奨。
について。
僕はこれまでオブジェクトのタイプチェックにkind_of?を使いまくっていました(たぶん、Javaみたいなstaticなオブジェクト指向言語の影響でしょうね)。反省。これからはDuckTypingです。
なお、DuckTypingの説明は、青木さんのが一番分かりやすいです。青木日記/T(2003-11-20)より引用します。
Duck Typing (名詞)
「猫っぽく見えるなら猫ってことにしとけばいいじゃん」という、現代的・殺那的な考えかた。にゃーと鳴いたら猫。わんと鳴いたら犬。respond_to?(:each) なら Enumerable。
ついでに、Rubyの標準ライブラリでDuckTypingを使っているところを探してみました。
logger.rb
177 class Logger
...
492 def initialize(log = nil, opt = {})
493 @dev = @filename = @shift_age = @shift_size = nil
494 if log.respond_to?(:write) and log.respond_to?(:close)
495 @dev = log
496 else
...
502 end
503 end
...
Loggerクラスのオブジェクトを生成するときには、引数logにwriteメソッドとcloseメソッドを持っている(IOぽい)オブジェクトを渡すことができます。「IOぽい」オブジェクトを渡せるというのが重要です。Dynamic Languageばんざい。
[コメントを書く]
トラックバック - http://d.hatena.ne.jp/ha-tan/20050804