2017-09-29 4 views
0

私はホテル予約システムのコードをリファクタリングしています。具体的には、学校プロジェクトのためにホテル内のすべての空室を一覧表示する方法です。私たちのインストラクターは彼のソリューションを提供しました。残念なことに、彼と残りの学校は月曜日(私たちのリファクタリングが予定されています)まで休憩しています。 StackOverflow、私はあなたの助けを利用することができます。ホテル予約システムのオーバーラップメソッドRuby

私の質問は、なぜ次のコードでbang(!)が使われたのかということになります。

def overlap?(other) 
    return !(other.checkout <= @checkin || other.checkin >= @checkout) 
end 

このコードは、Module HotelとクラスDateRange内のメソッドです。特定の日付範囲の空席を確認するために、別のクラスで呼び出されます。以下を参照してください。

overlap_reservations = @reservations.select do |res| 
    res.overlaps(dates) 
end 

私の考えでは、私はバングを利用しませんでした。しかし、私は初心者であり、ここでの相互作用の目隠しです。あなたが提供できるどんな助けもありがとうございます。

+0

この文脈では、 '!'は 'not'を意味します。つまり、括弧内のコードが 'true'と評価された場合、メソッドは' false'を返し、括弧内のコードが 'false'と評価された場合、メソッドは' true'を返します。あなたが提供した2番目のメソッドは 'overlap? 'を呼び出さず、' overlaps'を呼び出します。これはまったく別のメソッドです。 – moveson

+0

ありがとう@moveson。私は方法の重複をタイプミスをした?重複しているはずだった。あなたの洞察に感謝します。 – aprogrammer

答えて

1

このコードはいくつかの深刻なコードの匂いやグリッチに悩まされていますが、それは決して良いルビーコードには現れません。

def overlap?(other) 
    return !(other.checkout <= @checkin || other.checkin >= @checkout) 
end 
  1. 1はルビー方式の最後の行にreturn明示的に使用しないでください。 Rubyは値を返し、最後の行は自動的に評価されます。
  2. 人間の脳は否定的な二重/三重の状態に脆弱であるため、できるだけ条件を簡素化するようにしてください。
  3. 否定と否定は、結合に展開されるため、否定と組み合わせて使用​​しないでください。
  4. 私たちが一般的に使用される「チェックイン」と話している場合は、上記のコードは、さえ正しけれ疑う

合算「チェックアウト。」:

def overlap?(other) 
    # boolean for whether other checkout overlaps 
    co = other.checkout >= @checkin && other.checkout <= @checkout 
    # boolean for whether other checkin overlaps 
    ci = other.checkin >= @checkin && other.checkin <= @checkout 
    # return a result 
    ci || co 
end 

または、全体の電力を使用してルビーの:あなたの今後のクリスマスのレッスンから

def overlap?(other) 
    ci_co_range = @[email protected] 
    ci_co_range.cover?(other.checkout) || ci_co_range.cover?(other.checkin) 
end 

または(:)

def overlap?(other) 
    [other.checkout, other.checkin].any? do |co_ci| 
    (@[email protected]).cover?(co_ci) 
    end 
end 

ドキュメント:RangeEnumerable#any?

+0

あなたは私に研究や考えをたくさん与えてくれました! – aprogrammer

関連する問題