From: Tanaka Akira Date: 2009-04-03T14:53:13+09:00 Subject: [ruby-dev:38268] Re: rinda/eval.rb In article <20090403113741.A8C2.C613B076@garbagecollect.jp>, "U.Nakamura" writes: > 「呼んでNotImplementedErrorが起きるかどうか見ないと使えるかど > うかわからん」という事象自体が問題であるならば、互換性の問題 > を無視してよければ、forkのような例はそもそもそのような環境で > はメソッドを定義すべきではないと思います。 > # 前に却下された気もしますが... 最終的にユーザコードはどういう形で書くのが望ましいか、という ことなんですが、私は現在の NotImplementedError を rescue す るスタイルは基本的に良いスタイルだと思っています。 begin fork { ... } rescue NotImplementedError ... end このスタイルの利点は、typo の検出能力が高いことです。fork を 書き間違えた場合、外側に NoMethodError が伝わります。この検 出能力は fork が動作するプラットフォームかどうかに依存しませ ん。また、fork という名前は 1回書くだけで良いというのも typo の可能性を減らします。 それに対し、respond_to? を使うスタイルは typo の検出能力が劣 ります。 if Process.respond_to? :fork fork { ... } else ... end fork と 2回書かなければなりませんし、とくに respond_to? の引 数の :fork を typo すると、else 節が実行され、その内容により ますがその typo が検出されないかもしれません。そしてもちろん、 fork メソッドの呼び出しのところの typo は、fork のないプラッ トフォームでは検出できません。 しかし、fork のないプラットフォームで fork メソッドを定義し ないようにすると、前者のスタイルは使えなくなります。そのスタ イルで書けば begin fork { ... } rescue NoMethodError ... end となりますが、これは typo の検出能力を失っています。typo は NoMethodError を発生させますが、それは rescue されてしまいま す。 というわけで、私は fork がない環境で NotImplementedError に なるのは良いことである、と思っています。 実行せずに fork が動くか調べたいという要求を実現するのにあたっ て、その良さを失う必要があるかといえば、私のパッチで実現でき るように、べつに失う必要はありません。 というわけで私は、私の提案が実現する挙動を過渡的なものだとは 思っていません。むしろ、この挙動が良いのだ、と思っています。 じつは、メソッドを定義しないというのは、 Process.{getrlimit,setrlimit} を実装した時にしばらく試したん ですが、結局、上記のようなことを考えにいたって常に定義するこ とにしたという経緯があります。 -- [田中 哲][たなか あきら][Tanaka Akira]