From: Hideto ISHIBASHI Date: 2000-05-06T11:09:42+09:00 Subject: [ruby-list:22327] Re: runit 石橋秀仁です。 From: Masatoshi SEKI Subject: [ruby-list:22315] Re: runit > 咳といいます。 > > アサート(表明)という言葉の定義に忠実に言えば、 > > 「assert(表明)のcondition(条件)は*必ず*true(真)でなければならない」 > > ですね。 > > Rubyの「真」でなくて、「真の代表値」である定数TRUE、疑似変数trueの > trueですか? それとも Rubyの「真」?? これはユーザの側というより、RubyUnit自体について言及したものです。 RubyUnitのassert()の仕様が、rubikitchさんの次のコード > def assert_true(condition, message="", level=1) > unless condition > assert_fail(message, caller(level)); > end > end # assert_failが実行される条件:unless -> if not # "true"の補集合について条件が「真」になる。 になっていたほうがいい、という意味です。 # 以下に書くように、ただの"unless condition"よりも # "unless condition == true"ならもっと強力です。 > > ちなみに、assert()するconditionは*必ず*真理値をとるべきで、 > > それ以外(nilなど)の値を取るように作るべきではないでしょう。 > > # なんらかのメソッドの返り値をそのままassertで使う場合は注意が必要。 > > うむむ。それは if などで普段使ってる condition があったとして、 > assert(condition) > ではなく、 > assert((condition) ? true : false) > のように書くべきということでしょうか? 一言で言うと、 assert(表明)をするなら、曖昧さを排除して、 「疑わしければ失格」とする、厳しい検査がおすすめ。 ということです。 最初は、「通りやすい」ほうではなく、「通りにくい」ほうに 条件設定したほうがいい。なぜなら、表明する条件を緩めるのは 簡単ですが、厳しくするのは難しいからです。 # これは人間の思い込みによるものです。 # こんなところで、へたに人間を信頼すると、そもそもassertなんか使う # 意味がなくなります。徹底して性悪説を取るのが正解だと思います。 たとえば、 * true, false, nilのいずれかの値を取りうる場合 * 文字列, nilのいずれかの値を取りうる場合 などは注意したほうがよい、という意味です。 Rubyの"if"は、nilとfalse以外は(trueも含めて)、 「真」としますね。そうではなく、きちんと 「真」となるべき条件を限定するべきだという意味です。 簡単な例を上げると、return_okというメソッドの返り値として、 "OK"という文字列が期待される場合、次のどのコードを選びますか? 1. assert(return_ok) 2. assert(return_ok =~ /OK/) 3. assert(return_ok == "OK") 1 なら "NG" が通ってしまう。 2 なら "not OK" が通ってしまう。 3 なら "OK" と等しい文字列しか通らない。 ぼくなら3を選びます。 似たような例では、 begin ... rescue end のように、あまり曖昧に指定すると意味が薄れることがあります。 # というと「考え方」は分かっていただけると思うのですが・・・ -- Hideto "rubyholic" ISHIBASHI