C++ &引用;接口“;类来访问基类的辅助计算
我想知道如何最好地(在效率和可读性方面)实现一个设计模式,该模式包括一个基类和两个接口类(I1和I2),它们访问执行一些相对耗时的操作的类a 假设我们有一个基类a,它有一个方法:C++ &引用;接口“;类来访问基类的辅助计算,c++,design-patterns,C++,Design Patterns,我想知道如何最好地(在效率和可读性方面)实现一个设计模式,该模式包括一个基类和两个接口类(I1和I2),它们访问执行一些相对耗时的操作的类a 假设我们有一个基类a,它有一个方法: class A { // methods ... double computeValue(double in1, double in2, double& out1) { double result; /* Perform some very time consuming
class A {
// methods ...
double computeValue(double in1, double in2, double& out1) {
double result;
/* Perform some very time consuming computations with in1 and in2,
that leads to some intermediate values and the result */
// Compute side product from those intermediate values that took so long
// to obtain
out1 = intermediate_value1 * intermediate_value2;
return result;
}
// more methods and members
}
现在,假设我们有一个接口类(I1),它只对返回A的“结果”值感兴趣:
我可以用不同的方法拆分computeValue
,问题是out1
和result
的值应该从完全相同的输入中派生出来(我不想重复执行computeValue
,因为它在负载方面可能是一个“昂贵”的方法)
我想知道是否有任何设计模式可以帮助我实现这一点。任何帮助都将不胜感激
非常感谢这两个接口应该由两个具有输入的不同客户端使用?@tobi303这两个接口将由同一客户端调用,因此将具有相同的输入。似乎函数
compute\u value
实际计算两个值。它可以重构为返回两个元素的元组,您可以使用std::ignore
忽略任何一个调用中的一个元素。@hauron谢谢!但是我不应该调用computeValue两次吗?这就是我想要避免的,如果可能的话…@mgfernan你以前的方法也不会保护你。如果您希望避免调用它两次,请考虑缓存它:要么是单个“最后计算”的值,要么是一组这些-谷歌LRU缓存。您当然可以为这两个元素实现一个包装器结构,并将其移动(有点不相关,但查找命令设计模式)。这两个接口应该由两个具有输入的不同客户端使用?@tobi303这两个接口将由同一个客户端调用,因此,将具有相同的输入。似乎函数compute\u value
实际计算两个值。它可以重构为返回两个元素的元组,您可以使用std::ignore
忽略任何一个调用中的一个元素。@hauron谢谢!但是我不应该调用computeValue两次吗?这就是我想要避免的,如果可能的话…@mgfernan你以前的方法也不会保护你。如果您希望避免调用它两次,请考虑缓存它:要么是单个“最后计算”的值,要么是一组这些-谷歌LRU缓存。当然,您可以为这两个元素实现一个包装器结构,并将其移动(有点不相关,但可以查找命令设计模式),而不是缓存。
// Interface class to A
class I1 {
public:
// ctor, dtor, ...
double getResult(){double in1, in2, out1; return pA_->computeValue(in1, in2, out1);}
private:
std::shared_ptr<A> pA_;
}
// Interface class to A
class I2 {
public:
double getResult(){double in1, in2, out1; pA_->computeValue(in1, in2, out1); return out1;}
private:
std::shared_ptr<A> pA_;
}