1

現在、素晴らしい本「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 つ目の責任として既存のメソッドに追加する以外にガード句を使用する方法がわかりません。

それはできますか?他の人はどのようにそれを達成しましたか?

4

1 に答える 1

1

機能を他のクラス/モジュールに移動するのはどうですか?

module BikeChecker
  def capacity_empty_error
    raise "Docking Station is empty."
  end

  def release_bike
    capacity_empty_error if empty?
  end

  def empty?
    false
  end
end

class YourClass
  include BikeChecker

  def release_bike
    super
    bike
  end

  def empty?
    bike == nil
  end
end 

あなたは #empty をあきらめることができますか?メソッドは BikeChecker からのもので、理解を深めるためにここに残しました

于 2016-04-18T11:20:47.243 に答える