5

フロー制御のベストプラクティスを考えています。どちらに行けばいいですか?

1) 何もチェックせず、プログラムを失敗させます (よりクリーンなコード、自然なエラー メッセージ):

  def self.fetch(feed_id)
    feed = Feed.find(feed_id)
    feed.fetch
  end

2) nil を返すことで黙って失敗します (ただし、"Clean Code" では、null を返してはいけないと書かれています)。

  def self.fetch(feed_id)
    return unless feed_id
    feed = Feed.find(feed_id)
    return unless feed
    feed.fetch
  end

3) 例外をスローします (ID でフィードが見つからないのは例外的であるため):

  def self.fetch(feed_id)
    raise ArgumentError.new unless feed_id
    feed = Feed.find(feed_id)
    raise ArgumentError.new unless feed
    feed.fetch
  end

言い換えれば、何か問題が発生した場合、ガード条件を積極的に使用する必要がありますか、それとも Ruby / Rails メソッドに依存して例外をスローさせる方がよいでしょうか?

4

3 に答える 3

6

1) 何もチェックせず、プログラムを失敗させます (よりクリーンなコード、自然なエラー メッセージ):

既知の文書化された例外で「プログラムを失敗させる」ことは問題ありませんがNoMethodError、オブジェクトを使用しようとしたために不快な結果になるのnilは不注意です。あなたの特定の例でActiveRecord#findは、文書化されたActiveRecord::RecordNotFound例外が発生するため、IMOはこれが進むべき道です:

def self.fetch(feed_id)
  Feed.find(feed_id).fetch
end

2) nil を返すことで黙って失敗します (ただし、"Clean Code" では、null を返してはいけないと書かれています)。

nilこれは一般的なアドバイスとしては問題ありませんが、Ruby には;を返すメソッドがぎっしり詰まっています。それは問題ありません (繰り返しますが、文書化されている限り)、単に「何もない」ことを意味します (そして非常にコンパクトなパターンを許可しますsomething_that_can_be_nil || another_value)。この場合、Ick's を使用して簡潔に記述しますmaybe

def self.fetch(feed_id)
  Feed.find_by_id(feed_id).maybe.fetch
end

3) 例外をスローします (ID でフィードが見つからないのは例外的であるため):

はい。ただし、カスタムの例外ではなく、よく知られている例外をメソッドに発生させRecordNotFoundます (AR を使用しているという事実を抽象化したい場合を除きますが、これは非常に面倒な場合があります)。

于 2012-06-02T12:51:56.367 に答える
2

正しい答えは、場合によると思います。理論的には、ユーザーはフレームワークからのエラー メッセージに遭遇することはありません。これらの例外を処理できるように常に準備しておく必要があります。選択はすべてあなた次第です(それが外部で使用されるインターフェースなどでない場合)。

最初のルートを使用する場合は、その ID を持つフィードが存在するクエリを最初に取得してから、それをフェッチする必要があると思います。2 つの間でフィードが表示されなくなった場合は、報告するのが実際の問題になる可能性があります。3つ目は基本的に同じです。すべての状況を処理したことを確認する必要があり、その例外をスローすると、ユーザーにエラーが表示されるのを防ぐことができます。

2番目の解決策は基本的にこれですが、内部処理があります。nil を使用すると、何らかの問題があることを示します。また、処理するか、ユーザーに報告するか、または何かを行う必要があります。欠点は、これを忘れると、ユーザーを誤解させる可能性があることです。

最初の方法を使用し、それが存在することを確認する前に追加のチェックを行います。しかし、それは使い方次第です。

于 2012-06-02T12:39:49.807 に答える
2

私はクリーンバージョンに行きます。

feed_idメソッドに aを指定しないfetchと ruby​​ 自体が を発生させるArgumentError: wrong number of arguments(0 for 1)ので、#3 の最初の部分は意味がありません。

有効な を指定しないとfeed_idFeed.find(feed_id)呼び出しで別の例外が発生します。ほとんどActiveRecord::RecordNotFoundの場合、指定された ID を持つフィードが見つからなかったことを示すメッセージが表示されるか、ID が指定されていない (feed_idパラメーターが であったnil) 場合は、 ID のないフィードは見つかりませんでした。

でメソッドを呼び出すのはちょっとばかげているように思えるfeed_id = nilので、おそらく「無効な入力を送信すると壊れる可能性がある」と主張するでしょうActiveRecord::RecordNotFound。を上げた場合よりもArgumentError

null 値を返すことは、実際に何が問題だったのかがわからないため、めったに良いことではありません。したがって、#2 も除外します。

于 2012-06-02T12:45:51.850 に答える