【发布时间】:2011-10-08 07:46:57
【问题描述】:
我正在寻找重新设计我拥有的库。
目前我有一套算法,它们之间没有任何关系。
我的目标是让所有具体算法实现一个大致由Init() 和Run(In,Out) 组成的接口,以便我可以按以下方式执行它们:
void Process()
{
// IAlgotrithm* algX = new CAlgX(); X:{A,B,C}
IAlgorithm* algs[] = { algA, algB, algC };
for (int i=0; i < 3; i++) {
algs[i]->Init(...);
algs[i]->Run(In,Out);
}
}
问题是,目前每个算法都接受不同的结构体作为其输入参数。
例如,CAlgA 有一个方法Init(CAlgAParameter param),其中CAlgAParameter 是一个结构,其中包含特定于 AlgA 的字段。每个算法都有自己的结构,由不同类型的完全不同的字段组成。
解决这个问题的最佳方法是什么?
我能想到的一个选项是拥有一个包含与所有算法相关的所有参数的映射,并将初始化输入结构的工作委托给算法。也就是说,算法的客户端不会知道特定的输入结构是什么样子的——算法的工作是根据地图中的所有全局参数创建其输入结构。我不喜欢这个想法,因为它无法在编译时检查并且太容易出错。
解决这个问题的最佳方法是什么?
谢谢
【问题讨论】:
-
您是在问如何以通用方式定义
IAlgotrithm::Init吗?algA、algB的类型是什么? -
为什么不用参数构造算法呢?统一初始化的目标是什么?似乎负责 uniform 初始化/运行的代码不应该知道初始化细节。
-
@iammilind 是的,我想以通用方式定义 Init。 algX 是派生自 IAlgorithm 的具体类。 @user396672 我可以用某些参数构造它们,但是每次运行时我都需要给它们特定的参数
标签: c++ design-patterns