簡體   English   中英

在保持良好的面向對象設計的同時,重用代碼以獲得性能的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM