2015-05-05 155 views
3

比如我有一個基本的工作這樣一個功能:封裝這種功能的正確方法是什麼?

function myfunc(data,type_of_analysis){ 
    if type_of_analysis is "Smith-Jones Method" 
      return smith_jones(data) 
    else if type_of_analysis is "Pineapple-Mango Method" 
      return pineapple_mango(data) 
} 

名稱是由當然,和想象,有幾個類型的分析比這個的。什麼是重構myfunc()的正確方法?是否有更好/更標準的方法讓人們傳遞參數來確定他們想要執行的分析?或者這是用戶不得不在文檔中查找的東西?

+0

我建議採取看看策略模式在運行時禁用分析方法。 – Xaqq

+0

我確實看到了戰略模式,但不太明白如何將其應用於我的案例。 –

+0

你是否在說'myfunc(5,int)'應該返回類型爲'int'的5,而'myfunc(5,str)'應該返回數據類型爲'str'的​​''5''? – ZdaR

回答

1

這裏是在C++中,它使用枚舉值和功能對象之間的映射以得到類型安全,靈活的調度框架的一個示例:

//dummy analysis functions 
void smithJonesAnalysis (int data){cout << "Smith";} 
void pineappleMangoAnalysis (int data){cout << "Pineapple";} 

class Analyzer 
{ 
    //different analysis methods 
    enum class AnalysisMethod {SmithJones, PineappleMango}; 
    //a map from analysis method to a function object 
    std::map<AnalysisMethod, std::function<void(int)>> m_analysis_map; 

    AnalysisMethod stringToMethod (std::string method) 
    { 
     //some basic string canonicalisation 
     std::transform(method.begin(), method.end(), method.begin(), ::tolower); 
     if (method == "smith-jones method") 
      return AnalysisMethod::SmithJones; 
     if (method == "pineapple-mango method") 
      return AnalysisMethod::PineappleMango; 

     throw std::runtime_error("Invalid analysis method"); 
    } 
public: 
    Analyzer() 
    { 
     //register all the different functions here 
     m_analysis_map[AnalysisMethod::SmithJones] = smithJonesAnalysis; 
     m_analysis_map[AnalysisMethod::PineappleMango] = pineappleMangoAnalysis; 
    } 

    //dispatcher function 
    void operator() (std::string method, int data) 
    { 
     AnalysisMethod am = stringToMethod(method); 
     m_analysis_map[am](data); 
    } 
}; 

它用於像這樣:

Analyzer a; 
a("Smith-Jones Method", 0); 
a("Pineapple-Mango Method", 0); 

Demo

與簡單開關語句相比,這具有一大堆優勢:

  • 它很容易添加/刪除分析方法
  • 這是比較容易的方式來改變該方法接受
  • 你可以有不同的Analyzer S代表不同的區域,模板化和專業化的數據的類型,以及所有你想需要改變的是註冊方法。
  • 您可以啓用/在一個非常明確的時尚