[英]What's the best way to reuse code for performance while keeping a good Object Oriented design?
我正在開發一個科學計划,其中有幾個耗時的功能,從不同的其他功能調用。 我希望通過避免在不破壞OO概念(如封裝)的情況下多次使用相同參數調用相同的函數來優化這些調用。
我試圖制定一個基本的例子。 A類有一個B類對象,我從中計算出A類函數所需的中間結果。 例如,為了讓functionA和functionB計算其結果,每個函數都需要從B調用對象的time_consuming_function。通常這個函數是從循環內調用的,所以參數(1和2)在調用中是相同的功能A和功能B.
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上更新使用此參數更改的所有屬性,並且當從類AI執行我的函數時,只需要使用先前計算的值。 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:
我有一個程序進行多次計算,每個計算都調用函數來獲取中間值。 從接收相同參數的函數調用時,這些值是相同的,我正在尋找一種方法來優化這些調用重用這些中間值。
在保持良好的面向對象設計的同時重用這些值的最佳方法是什么?
通過代理緩存對這些方法/對象的訪問,緩存最近的結果並返回緩存的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.