gpt4 book ai didi

encapsulation - 封装这种功能的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 06:36:14 25 4
gpt4 key购买 nike

例如,我有一个基本上以这种方式工作的函数:

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() 的正确方法是什么?是否有更好/更标准的方式让人们通过参数来确定他们想要执行哪种分析?或者这是用户必须在文档中查找的内容?

最佳答案

这是一个 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

与简单的 switch 语句相比,这有很多优点:

  • 更容易添加/删除分析方法
  • 更改方法接受的数据类型要容易得多
  • 您可以针对不同的领域使用不​​同的Analyzer,模板化和特化,您需要更改的只是注册方法。
  • 您可以在运行时以非常清晰的方式启用/禁用分析方法

关于encapsulation - 封装这种功能的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30058416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com