前田です。

At Mon, 15 Nov 1999 20:27:01 +0900,
Hideaki Takata <hideakit / d3.dion.ne.jp> wrote:
> > 「処理に責任がもてないことがある」という発想も理解できないこ
> > とはないのですが、個人的には動的型のオブジェクト指向言語では
> > どのようなメソッドを持っているか(シグナチャ)が重要なので、
> > 型によるチェックを含めるべきではないと考えています。
> 
> 僕は、型チェックをしないのが気分が悪かったのですが、これが、
> それが「犬」 であることによってのみ、「犬」の動作が保証される。それが「猫」
> であるならば、保証はできない。

型チェックをしないのが気持ち悪い、という気持ちは私もわかるのです
が、それはおそらく静的な型を持つ言語に慣れているからだと思います。

継承には二つの意味があります。

・インタフェイスの継承
・実装の継承

このうち、メソッドの引数の型チェックで継承関係をチェックするのは、
インタフェイスの継承という観点に立っています。

ところがRubyのように静的な型を持たない言語では継承は実装の継承の
ために使われるので、クラスライブラリはインタフェイスの継承という
観点からは設計されていません。
# 静的な型を持つ言語の場合はインタフェイスの継承を用いないと多態
# を実現できませんが、Rubyのように静的な型を持たない言語では多態
# を実現するためにインタフェイスの継承を必要としないからです。
# ちなみに、まつもとさんが13日のセミナーで「継承は必須ではない」
# とおっしゃっていたのはこの意味です。

このため、Rubyで継承関係によって引数をチェックするのはあまり賢明
な方法とは言えません。

たとえば、

def half(x)
  return x / 2
end

のようなメソッドを、

def half(x)
  raise TypeError unless x.kind_of?(Numeric)
  return x / 2
end

としてしまうと、このメソッドはMatrixのようにNumericのサブクラスで
ないものに対応できなくなってしまいます。

というわけで、私としては、

def foo(obj)
  case obj
  when String
    ...
  when Integer
    ...

のように処理が枝分かれするケース以外では型チェックをしないことを
おすすめします。
# それでは不安だという方にはSatherという言語をおすすめします:-)

-- 
前田 修吾
一度型チェックに反対する理由を書いておきたかったのですよね。