2015-05-05 113 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代表不同的区域,模板化和专业化的数据的类型,以及所有你想需要改变的是注册方法。
  • 您可以启用/在一个非常明确的时尚