2016-04-18 8 views
1

現在、Rubyの実用的なオブジェクト指向デザインを読んで、シンプルなカタを使って実際に議論しているプリンシパルのいくつかを実践しています。Guardの句とSRP(Single Responsibility Principle)

私は次のことを行い方法があります:

def release_bike 
    capacity_empty_error if empty? 
    bike 
end 

これは私のクレードルクラスから(私はバイクのオブジェクトが引数であることを認識しています「バイクのオブジェクトを解放」が、時間のために、私であることをメソッドが自転車のオブジェクトを返すだけでなく、取り外すことができます)。

def capacity_empty_error 
    raise "Docking Station is empty." 
end 

そして#empty:

#capacity_empty_errorは、次のでしょうか?自転車は私のインスタンス変数@bikeのラッパーメソッドである

def empty? 
    bike == nil 
end 

:のように見えます。したがって、DockingStationクラスの現在の容量は、#bikeが何かに設定されているときにコードがいっぱいであると仮定しているので、1です(後で適切な容量を追加する予定です)。

だから、うまくいけば私のコードについて説明して、質問をしていない場合は改善を提案してください、私が聞きたい質問は次のとおりです。

私は#release_bikeでガード句ラインと感じている:

capacity_empty_error if empty?

はその方法の責任の1つであり、次の行にあるbikeの返信は2番目の責任です。 Tisは明らかにSRPを壊しますが、既存のメソッドに2番目の責任として追加する以外はガード句を使用する方法はわかりません。

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

+0

私はこのように見ています。「release_bike」の契約は「私は自転車を解放して返します」です。しかし、ラックが空の場合はそれを行うことはできません。 SRPは実際には、メソッドがそのケース自体を処理することを必要とします。このケース自体は、例外を発生させることによって選択します...あなたはそれを別の方法で自由に見ることができます。 –

答えて

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をあきらめることができますか?私はそれをより良い理解のために残しました。

+0

ああ!私はスーパーの使用を見たことがない、非常にイゴールありがとう。 – Joe

関連する問題