石橋秀仁です。

At Fri, 12 Nov 1999 16:41:36 +0900
  "Hideaki Takata" <hideakit / d3.dion.ne.jp> wrote:

> 高田です。
> 最近、JavaのプログラムをRubyに書き直していて、思ったのですが、
> 型のあるオブジェクト指向言語で書かれたプログラムをRubyで書き直すとき、メソッ
> ドの引数が、特定のクラスのオブジェクトでないと処理に責任がもてないことがある
> ような気がします。
(略)
> みたいな、処理を結構書くことになってしまいます。こういうのがあると、コードが
> 読みにくくていやなんですが、こういうのをもっとわかりやすく書く、あるいは、こ
> ういうことを考えなくても良いような、設計上のコツのようなものというのはあるで
> しょうか?

ぼくなりの考え方を。お目汚し。

UMLは基本的に静的型の言語だと思います。ですから、UMLで設計すれば、
こういう問題は出て来ないと思います。言い替えれば、オブジェクトの
協調collaborationを設計する段階で、パラメータの型が静的に決まり
ます(is-aは除いて)。

ですから、メッセージの送り側がパラメータに責任をもつ必要があり、
その考え方を再帰的に適用すれば、結局、型チェックはオブジェクト(*1)
を最初にインスタンス化するときの一回で十分ということになります。
その場合、システム内部で生成されるオブジェクト(*2)については、正当性
チェックは必要ありません(それはアルゴリズムの正当性から保障される
はずです)。
(*1)システム外部からの入力を用いてインスタンス化されるデータ
    例:ユーザの入力文字列、"1999/11/12"から生成されるDate
(*2)例:2つのDateの差から生成される日数Integer

結論としては、システム外部とのインタフェイス部でないオブジェクト
(問題領域/ビジネスロジック)は、パラメータチェックの責務を負わない
ということです。

どうでしょうか?

文書化が不十分なグループ開発や、クラスライブラリの開発などでは、
性善説に過ぎる気もします。プロジェクトによりけりでしょうか。
---
Hideto ISHIBASHI <http://vip.cis.kurume-nct.ac.jp/%7Es34204/>
PGP key fingerprint = 09 46 62 9C 16 36 12 42  A3 AD 1D 40 A5 95 36 20