在父母的内部状态中四处寻找

时间:2012-06-30 11:14:31

标签: ruby decoupling

tl:dr 解耦是如何工作的?可能需要一些小例子

我正在阅读Ruby编程 - 实用程序员指南。 (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以存储持续时间(以毫秒为单位)。突然之间,卡拉OK宋将开始报道荒谬的价值观。卡拉OK版“我的方式”的想法&#39;持续3750分钟是非常可怕的考虑。

相反,您应该使用super:

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

现在,当@duration变量仍然以毫秒为单位存储歌曲持续时间时,刚刚调用父方法的新 to_s 如何解决问题?它仍然会返回3750分钟,不是吗?

我想我真的不明白那两者之间的区别。

1 个答案:

答案 0 :(得分:3)

假设Song会处理其@duration的正确输出。

如果我们决定更改Song以存储持续时间(以毫秒为单位),我们只会更改Song#to_s方法,而不必更改其所有后代的to_s。< / p>