2011-05-24 13 views
1

在我的假設應用程序中,用戶可以提出問題,然後通過Oracle回答。您可以使用Predictor.predictor方法獲得適當的Oracle,然後您可以向其提供您的問題。當你的問題#ask,你會得到一個迴應,連同Oracle的確定性(一個0到1範圍內的浮點數)關於它的響應。如何在一次調度一個實例之前同時調度一個方法?

class BaseOracle; def ask(question); ...; end; end 
class UnreliableOracle < BaseOracle; ...; end 

module Predictor 
    def self.predictor 
    @predictor ||= UnreliableOracle.new 
    end 
end 

Predictor.predictor.ask("How many fingers am I holding up?") 
# => ["three fingers", 0.2] 

在這個實現中,你每次都得到一個相同的Oracle,一個UnreliableOracle實例。我想要做的是更改Predictor.predictor的實現,以便將調用的方法委託給Oracles的集合,其中一些比其他更好。換句話說,我希望它能這樣工作:

class BaseOracle; ...; end 
class UnreliableOracle < BaseOracle; ...; end 
class PopCultureOracle < BaseOracle; ...; end 
class ScienceOracle < BaseOracle; ...; end 
class LiteraryOracle < BaseOracle; ...; end 
class FingerCountingOracle < BaseOracle; ...; end 

module Predictor 
    def self.predictor 
    ############## What goes here? 
    end 
end 

# This actually asks several oracles for an answer and picks the best one. 
Predictor.predictor.ask("How many fingers am I holding up?") 
# => ["four fingers", 1.0] 

這樣做的最佳方法是什麼?

回答

2

這實質上是strategy design pattern,其中每個Oracle實際上是一個回答問題的策略。

最簡單的(也許是最乾淨的)方法是建立一個MetaOracle,詢問對方的預言正確的答案是什麼,選擇最佳答案:

class MetaOracle 
    def oracles 
    @oracles ||= [ScienceOracle.new, LiteraryOracle.new, # ... 
    end 

    def ask(question) 
    oracles.map { |o| o.ask question }.  # Ask each Oracle a question ... 
     sort_by { |answer| -answer.certainty }. # sort by the best answers ... 
     first         # ... and pick the best one. 
    end 
end 

module Predictor 
    def self.predictor 
    @predictor ||= MetaOracle.new 
    end 
end 

現在甲骨文最好的答案勝會成爲你看到的答案。

相關問題