7

私はRubyを使い始めたばかりで、RubyMineがこのコードを変更するように提案したときにステートメント修飾子を発見しました。

if !VALID_DIRECTIONS.include?(direction)
   raise ArgumentError, "Invalid direction"
end

これに:

raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)

私はそれがコードをより簡潔にする方法が好きです。ただし、条件の前に効果が置かれるため、一見誤解を招きやすく、読みやすさの問題が発生する可能性があります。繰り返しになりますが、それは私がCスタイルの言語にとても慣れているからかもしれません。

ステートメント修飾子を使用した結果、誰かが問題に遭遇したことがありますか、それともコードが改善されたと思いますか?また、修飾子を使用するための一般的なガイドラインを持っている人はいますか(つまり、一部の操作では特にうまく機能するか、他の操作では機能しない)?

4

4 に答える 4

9

他のコードの可読性ガイドラインが引き続き守られていれば、通常、これらの後続の条件を読むのに問題はありません(これらは時々呼ばれることもあります) 。60文字の式と40文字の条件を同じ行に置くと、100文字のテキストのゴブになります。これは、末尾の条件の問題とは完全に関係なく、確実に判読できなくなります。

表示している特定のコードサンプルでは、​​条件付きのフォローが必要であることは明らかです。最初に議論を見ることさえせずraiseに誰がしたいですか?ArgumentError

また、末尾の条件文は、数学および関数型言語のガード句に似ています。これらは、ガードしている式のに記述される傾向があります。

最後になりましたが、メソッドの制御フローを単純化するために、メソッドの先頭にいくつかの式をガードの一種として配置することは、実際には良いスタイルraise Bar if fooreturn nil if quux見なされます。繰り返しますが、これらはメソッドの最初に来るので、条件がなければならないことは明らかです。そうでなければreturnメソッドの最初から行うのは意味がありません。


unlessPS:否定を取り除くために、私は実際にそこで使用します。より複雑な条件では、それを解析するのが難しい場合があることがわかりますunlessが、この場合、少なくとも私見では、より明白です。

于 2009-12-26T09:37:10.153 に答える
8

ステートメント修飾子を使用すると、ルビーは英語のように動作します。これはすばらしいことです。

  • 雨が降ったら家にいる
  • 雨が降っても家にいる

最も自然でエレガントに見えるフォームを使用することをお勧めします。疑わしい場合は、両方の形式で声明を読み上げてください。個人的には、ステートメント修飾子は次のような短いステートメントにのみ使用する傾向がありますreturn :nope if input.nil?。長いステートメントや複雑なステートメントの場合、目は特定のスペースしかカバーしないため、誰かが読むだけであるため、読者が把握するのに時間がかかる可能性があります。一目見ただけで修飾子。

于 2009-12-26T08:13:37.170 に答える
4

最初は少し不思議でしたが、読みやすさの問題はないと思います。Rubyで多くの作業を行う場合、それは完全に理にかなっています。それが目立つのは、他の言語と行ったり来たりしたときだけです。ただし、Rubyコードに没頭すると、1行の条件文を簡潔かつ簡潔に記述できることがわかります。また、の使用に慣れてunlessください。あなたのコード行は(多分)書くことができます:

raise ArgumentError, "Invalid direction" unless VALID_DIRECTIONS.include?(direction)
于 2009-12-26T06:22:47.270 に答える
0

それは純粋に主観的なスタイルの問題です。快適に感じるものは何でも使用してください。

于 2009-12-26T06:21:27.617 に答える