队列而不是方法链接和规则,而不是Ruby中的条件

前端之家收集整理的这篇文章主要介绍了队列而不是方法链接和规则,而不是Ruby中的条件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Rich Hickey在他的演讲 Simple Made Easy中描述了Clojure和Haskell的范例.作为一个ruby / rails程序员(这是我真正知道的),我喜欢他的想法,但不明白其中2个:

>使用队列,而不是方法链接
>规则而不是条件

改用队列

显然,在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

在这里,多态性给出了一种描述系统如何使用不同数据进行操作的方法,这些数据允许我们为新数据引入新的行为.所以,伟大的工作,你(希望)避免条件每一天!

猜你在找的Ruby相关文章