現在、素晴らしい本「Practical Object Orientated Design In Ruby」を読んでいて、簡単なカタを使って、その中で説明されている原則のいくつかを実際に実践しています。
次のことを行うメソッドがあります。
def release_bike
capacity_empty_error if empty?
bike
end
これにより、私の DockingStation クラスから「自転車オブジェクトが解放されます」(自転車オブジェクトが引数であることは認識していますが、当面は、メソッドが自転車オブジェクトを削除するのではなく、自転車オブジェクトを返すようにしたいだけです)。
#capacity_empty_error は次のことを行います。
def capacity_empty_error
raise "Docking Station is empty."
end
そして #空?次のようになります。
def empty?
bike == nil
end
ここで、bike はインスタンス変数 @bike のラッパー メソッドです。#bike が何かに設定されている場合、コードはそれがいっぱいであると想定しているため、DockingStation クラスの現在の容量は 1 です (後で適切な容量を追加する予定です)。
うまくいけば、それが私のコードを説明しています。質問をして、そうでない場合は改善を提案してください。私が尋ねたい質問は次のとおりです。
#release_bike のガード条項は次のように感じます。
capacity_empty_error if empty?
はメソッドの 1 つの責任でありbike
、次の行での戻りは 2 番目の責任です。これは明らかに SRP を壊しますが、2 つ目の責任として既存のメソッドに追加する以外にガード句を使用する方法がわかりません。
それはできますか?他の人はどのようにそれを達成しましたか?