我有一个问题,特别是关于设计良好的可重复 和可扩展 代码,允许分析特定类型(将保持不变)。我的目标是类似于装饰器 的设计模式,但它不需要那么复杂。
案例研究
我有一个聚类算法,可以在一组密集的激光数据中识别几个不同的点云集群。这对问题并不重要,但为问题提供了良好的背景。问题是我知道只有一个集群是我想要处理的特定对象。这在不同的场景中可能是不同的对象,因此我希望能够创建集群类,用户可以在其中指定自己的函数来识别它。这些函数可以采用以下形式:
分析数据的质心。位置?它是否属于禁区?
点云分析。它有多大,它指向哪个方向,法线是什么样的。
用户可能希望先分析所有点云,然后再决定选择哪一个。例如,在上述案例研究中,其中一个函数可能是
bool doesItHaveTheMostPoints(PointCloud)
,除非您在集群上循环两次,否则很难对其进行评估。
最佳答案
目前的解决方案
目前我已经开发了一种方法,允许用户将功能添加到将要使用的类中。这些函数特定于质心或点云。
这是一个简单的例子,说明如何:
// Some functions that can be used to analyse the data.
bool is3(int value) {
if (value == 3)
return true;
return false;
}
bool ismodulo3(int value) {
if (value % 3 == 0)
return true;
return false;
}
// The extractor class
class A {
public:
//Added data analysis functions go into a vector.
void addFunctionPointer(bool (*function)(int)) {
functions.push_back(function);
}
// Here the functions would be evulated to determine if the
// data is what we want.
void print(void) {
for (int i = 0; i < functions.size(); ++i)
{
std::cout << "Function: " << i << " evalutes: "
<< functions[i](value) << std::endl;
}
}
// The data being analysed.
int value;
// The functions stored to analyse it.
std::vector<bool (*)(int)> functions;
};
// A simple example implementation.
int main() {
A a;
a.value = 6;
a.addFunctionPointer(&is3);
a.addFunctionPointer(&ismodulo3);
a.print();
}
缺点是:
我发现它不是很容易阅读,代码的意图在没有解释的情况下不是特别清楚。
当前的解决方案不能很好地处理用户可能希望在决定选择哪一个之前分析所有点云的可能性。例如,在上面的案例研究中,其中一个函数可能是 bool doesItHaveTheMostPoints(PointCloud),这在上面的解决方案中很难评估,因为需要某种级别的存储内存。
关于c++ - c++中数据多模型分析的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564948/