我正在开发一个有几个耗时的科学计划 从不同的其他函数调用的函数。我想优化 这些调用避免使用相同的参数调用相同的函数 曾经没有破坏封装等OO概念。
我试图制定一个基本的例子。 A类的对象是 B类,我从中计算A类函数所需的中间结果。 例如,为了使functionA和functionB计算其结果, 每个函数都需要从B调用对象的time_consuming_function。 通常这个函数是从循环内调用的,所以参数(1和2) 在对functionA和functionB的调用中是相同的。
class ClassA {
ClassB obj // member object
return_type functionA(parameter1, parameter2) {
value1 = obj.time_consuming_function(parameter1)
value2 = obj.time_consuming_function(parameter2)
return some_operation_with(value1, value2)
}
return_type functionB(parameter1, parameter2) {
value1 = obj.time_consuming_function(parameter1)
value2 = obj.time_consuming_function(parameter2)
return some_operation_with(value1, value2)
}
}
一种解决方案是创建一个结构来保存计算值 调用ClassA函数,例如:
class ClassA {
ClassB obj // member object
return_type functionA(data) { // data is a structure to hold the values
if (data.is_empty()) {
data.value1 = obj.time_consuming_function(parameter1)
data.value2 = obj.time_consuming_function(parameter2)
}
return some_operation_with(data.value1, data.value2)
}
return_type functionB(data) { // same data obj as before
// this time data is not empty, so no calculation needed
if (data.is_empty()) {
data.value1 = obj.time_consuming_function(parameter1)
data.value2 = obj.time_consuming_function(parameter2)
}
return some_operation_with(data.value1, data.value2)
}
}
另一个解决方案是创建一个类Data来预先保存数据。 在这种情况下,拥有参数1和2,我会更新所有属性 在类Data上使用此参数进行更改以及从中执行函数时 A类我只需要使用之前计算的值。班级 A将提供Data类的接口。
class Data {
ClassA class_a_obj
void update_values_that_depend_on_parameter1(class_a_obj, parameter1) {
value1 = class_a_obj.time_consuming_function(parameter1)
}
void update_values_that_depend_on_parameter2(parameter2) {
value2 = class_a_obj.time_consuming_function(parameter2)
}
}
class ClassA {
ClassB obj // member object
return_type functionA(data) {
return some_operation_with(data.value1, data.value2)
}
return_type functionB(data) { // same data obj as before
return some_operation_with(data.value1, data.value2)
}
return_type time_consuming_function(parameter) {
return obj.time_consuming_function(parameter)
}
}
我想知道您对此问题的看法以及建议的解决方案。 还有其他合适而有效的解决方案吗?
TL; DR:
我有一个程序可以进行多次计算和每次计算 调用函数来获取中间值。这些值是相同的 从接收相同参数的函数调用,我正在寻找一种方法 优化这些调用重用这些中间值。
在保持良好对象的同时重用这些值的最佳方法是什么 面向设计??
答案 0 :(得分:3)
通过代理缓存对这些方法/对象的访问,缓存最近的结果并返回缓存的结果。