2

tl:drデカップリングはどのように機能しますか? ちょっとした例が必要かもしれません

Ruby のプログラミング - The Pragmatic Programmer's Guide を読んでいます。(http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html)

Song のサブクラス KaraokeSong にto_sを実装する方法の例があります。

class KaraokeSong < Song
# ...
def to_s
"KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}]"
end
end
aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...")
aSong.to_s    »  "KS: My Way--Sinatra (225) [And now, the...]"

今、彼らはそれを行うのは悪い方法だと言います:

Song をミリ秒単位で保存するように変更したとします。突然、KaraokeSong はばかげた値を報告し始めました。「My Way」のカラオケバージョンが 3750 分間続くというアイデアは、あまりにも恐ろしくて考えられません。

代わりに、to_s を super で定義する必要があります。

def to_s
super + " [#{@lyrics}]"
end

@duration 変数がまだミリ秒単位で曲の長さを保存している場合、親のメソッドを呼び出すだけの新しいto_sはどのように問題を解決するのでしょうか? それでも 3750 分を返しますね。

私はそれらの2つの違いを本当に理解していないと思います。

4

1 に答える 1

3

Songがその の適切な出力を処理すると想定されてい@durationます。

またSong、期間をミリ秒単位で保存するように変更する場合は、メソッドを変更するだけで、そのすべての子孫Song#to_sを変更する必要はありません。to_s

于 2012-06-30T11:18:38.520 に答える