From: Tanaka Akira Date: 2005-01-10T00:41:34+09:00 Subject: [ruby-dev:25449] Re: 1.8 warn nonblocking IO#read and add IO#readpartial In article <20050109142307.9D7F.MTJ@fiberbit.net>, 角 元司 writes: > rubyの警告は有無をいわせずコンソールに表示されるうえ、 指摘しておくと、C レベルでは rb_warn と rb_warning の 2種類があります。 前者がデフォルト状態でも表示されるもので、後者が -w をつけないと表示さ れないものです。 > 警告が実行時に表示されるものの場合、ループ内で実行すると > ループの回数だけくりかえし表示されるため、かなり目立ちます。 > ひどいときには、大量に表示されるためにプログラムが > 利用不可能になります。 興味深いです。具体的にはどの警告が大量に表示されますか? > 特に、プログラムを使っているのが開発者自身ではなくエンドユーザの場合、 > 警告表示を放置できることはまずなく、結局コードを修正せざるをえません。 > rubyをマイナーバージョンアップするたびにこの作業が必要になるのは、 > いささかおっくうです。 なるほど。 > 私の意見としては、すべての警告に対して、デフォルトで表示するのは > 緊急で重要なものだけに限り、将来のバージョンに対する互換性などの > 軽微な警告は、-wが指定されたときにのみ表示するのがよいと思います。 > いかがでしょうか。 最初に述べたように、すべての警告がデフォルトで表示されているわけではあ りません。 ただ、使い分けがはっきりしていないとは思うので、そういう使い分けの主張 は有用だと思います。そして、判断基準がもっと具体的になると受け入れられ やすいと思います。思うに、開発者は自分が開発している所が重要だと考えが ちで、警告を出しすぎるきらいがあるのかもしれません。 > ドキュメントのほうが確実に問題点を把握できるのではないでしょうか。 > IO#readを使っているかどうかあやふやなら、ソースコードに対してgrepを > かければ済む話のような気がします。 そんなに簡単でしょうか? 今回の変化は、nonblocking IO に対する read が問題となります。ある read が IO に対するメソッド呼び出しであり、その IO が nonblocking mode であ るかどうかはどう判定できるでしょうか? > 警告による方法では、カバレッジ100%の回帰テストを実施しない限り、 > 問題がないという確証が得られません。これは、ソースコードの一部を > 修正して、修正部分だけ再テストするより、はるかに手間がかかります。 > rubyをマイナーバージョンアップするたびに、稼動中の > rubyスクリプトに対してテストを実施するのは難しいと思います。 これは指摘のとおり完全ではありません。警告が完全なものでないことは理解 しています。しかし、完全ではなくとも救えるものはかなりあって、それはそ れで意味があることだと考えています。カバレッジ100%の回帰テストがなくと も、普通に実行するだけでも主要な問題は検知できるのではないでしょうか。 もちろん、警告がドキュメントよりも常に確実だと主張しているわけではあり ません。しかし、警告は問題点を確認するのにドキュメントよりも便利なこと があると考えています。ドキュメントはある項目があるプログラムに実際に適 用されるのかどうかを調べるには、自分で確認しなければいけないのに対し、 警告は単に実行しさえすればわかるためです。 > 先ほど書いたように、警告メッセージはかなり目立つので、 > エンドユーザがプログラムを使用中に表示されるのはつらいです。 > 仕事中に、突然エンドユーザに「動作が変だ」と言って呼びつけられるのは > かなり屈辱的なので、あまりたびたびだと、rubyを嫌いになるプログラマが > 増えると思います(笑)。 > > その結果、結局-W0を使わざるをえないのでは、警告メッセージの > 効果がなくなってしまいます。 警告を誰に届けたいのか、というのは重要なポイントですね。 今回の場合は、1.9 への移行を検討し作業を行う人に届けたいのですが。 > ドキュメントなどでお手伝いできることがあればお知らせください。 それはありがたいです。今回の変更をリリース時につけるドキュメントに忘れ ずに載せることをお願いできますか。 たぶん、リリース時にそういうドキュメントをつけるべきだということを主張 する所からはじめないといけないと思いますが。 -- [田中 哲][たなか あきら][Tanaka Akira]