改用队列
显然,在Rails中,我们喜欢方法链接,但是我想了解Ruby中描述的一个Queue的样子(视频中的54:54):
If thing A calls thing B,you just complected it. You have a when and where thing. A has to know where B is in order to call B. When that happens is whenever that happens is when A does it. Stick a Queue in there.
规则与条件
他谈论不使用条件或切换语句,而是使用规则(视频中的30:00).
我根本就不用说Ruby.如何在不使用条件的情况下作出决定?
感谢所有,
贾斯汀
解决方法
这里的想法是,不是将值直接从一个对象传递给另一个对象,我们可以通过在它们之间粘贴一个队列来将它们分离.
假设我们正在为一个从鸡收集鸡蛋的农民建模.鸡生产鸡蛋,农民收集鸡蛋.当他们收集了五个鸡蛋时,农民的转变就完成了.通常我们可能会写这样的东西:
class Chicken def initialize(name) @name = name end def lay_egg sleep random(3) "an egg from #{@name}" end end class Farmer def initialize(name,chicken) @name = name @chicken = chicken end def work_shift 5.times do egg = @chicken.lay_egg puts "#{@name} got #{egg}" end end end betsy = Chicken.new "Betsy" fred = Farmer.new "Fred",betsy fred.work_shift
所以,农夫等待着鸡肉,随着鸡蛋的来临.伟大的问题解决了,去冰箱喝啤酒.但是,如果说我们买了第二只鸡来加倍我们的蛋产量呢?或者,如果我们想通过从纸箱拿起鸡蛋来测试我们的农民的灵巧呢?
因为我们已经编码了农民需要一只鸡,所以我们失去了做出这些决定所需的灵活性.如果我们可以解耦,我们会有更多的自由.
所以,让我们在他们之间留一个队列.鸡会在鸡尾酒的顶部产卵;农民将从滑槽的底部收集鸡蛋.任何一方都不直接依赖另一方.在代码中,可能看起来像这样:
class Chicken def initialize(name,chute) @name = name @chute = chute Thread.new do while true lay_egg end end end def lay_egg sleep rand(3) @chute << "an egg from #{@name}" end end class Farmer def initialize(name,chute) @thread = Thread.new do 5.times do egg = chute.pop puts "#{name} got #{egg}" end end end def work_shift @thread.join end end chute = Queue.new betsy = Chicken.new "Betsy",chute fred = Farmer.new "Fred",chute fred.work_shift
除了现在,我们可以轻松添加第二只鸡.这是东西的梦想是:
chute = Queue.new betsy = Chicken.new "Betsy",chute delores = Chicken.new "Delores",chute fred.work_shift
你可以想象我们如何也可以说,用一堆鸡蛋加载一个溜槽来测试农民.不需要嘲笑一只鸡,我们只是准备一个队列并将其传入.
再见,有条件
我对此的回答可能更有争议,但要短得多.你可以看一下multimethods in Ruby,但是这个想法的核心是要打开封闭的,硬编码的逻辑路径,有利于开放的,实际上,普通的ol’多态可以实现这一点.
每当您调用某些对象的方法而不是切换其类型时,您将利用基于Ruby的基于类型的规则系统,而不是对逻辑路径进行硬编码.显然,这个:
class Dog end class Cat end class Bird end puts case Bird.new when Dog then "bark" when Cat then "meow" else "Oh no,I didn't plan for this" end
比这更开放:
class Dog def speak "bark" end end class Cat def speak "meow" end end class Bird def speak "chirp" end end puts Bird.new.speak
在这里,多态性给出了一种描述系统如何使用不同数据进行操作的方法,这些数据允许我们为新数据引入新的行为.所以,伟大的工作,你(希望)避免条件每一天!