2013-05-26 85 views
3

我有一個OOP設計問題。類別列表與列表類別

我們假設我有一個類包含幾個數字標量屬性,如最大值,最小值,頻率等。由於數據連續不斷地流入,我最終會得到一個這樣的類實例列表。例如,爲了獲得全局最小值,我遍歷列表中的所有類以找到它。

或者,我可以實例化一個類(可能是單例),其中包含列表而不是標量,每個屬性以及遍歷列表的函數成員。然而,這種方法似乎生成的代碼看起來更像程序化而不是面向對象編程。

問題是:什麼標準定義選擇哪種方法?如果效率很重要,我應該選擇一個包含每個屬性列表的類嗎?如果可讀性是關鍵,我應該選擇一個類的列表?

感謝您的建議。

+0

取決於你想要設計的..請發佈一些sudo代碼並添加更多信息。什麼是類?它們包含什麼?你如何看待這些類的互動等等。 –

+0

正如@Dory Zidon寫道:這取決於你想要完成什麼。如果您有一些高性能要求,將數據分解成列表可能是必要的,但如果清晰和易於維護是優先考慮的事情,則可能需要做相反的事情。 – mzedeler

+0

請在這裏提問[爲什麼這是一個糟糕的問題](http://stackoverflow.com/faq#dontask)。 – msw

回答

1

基本上你askyng如果它更優選具有一個「結構數組(AOS)」或「陣列(SOA)的架構」

答案取決於你需要用這個數據做什麼。如果要編寫比結構數組更易讀的代碼,如果要使用SSE或CUDA來優化計算繁重的代碼,請使用「數組結構」。

如果您在文學術語「結構數組(AOS)」和「陣列(SOA)結構」搜索,你會發現很多關於這個話題的深度的論文,我在這裏鏈接只是一些討論:

+0

感謝您的回答。我已經開始閱讀。我相信你的回答儘可能地解決了我的問題,因爲它指出了這個問題在文獻中被廣泛討論,並且沒有二進制是/否解決方案。 – user2423086

0

基本上,OOP不是解決編程中的每個問題的方法,有時您必須在此之下看到更多的東西。問題是你必須專注於這個問題。效率應該更好。但是如果你的代碼需要花費太多的時間來加載,或者你可以說它的時間複雜度太高,那麼你就會遇到麻煩。你必須保持手中的兩端。我更喜歡的是類的列表,而不是列表的類。但不同的人有不同的觀點,所以我們應該尊重他們。爲什麼我選擇了類的列表,因爲我將每個對象與尊重的數據,比如說,我有一個更高頻率的對象,一個更低,一箇中等,管理所有這些會更容易,而且不會很多時間會被採取。我認爲在這兩種情況下它都是O(n),其中n是我的情況中元素或類的數量。

1

您在詢問決策標準。讓我推薦一個:

您應該考慮在應用程序中構成數據點的是什麼。假設您正在測量值,一個數據點由幾個數字屬性組成。那麼你肯定會想要一個類的列表,其中類表示所有的屬性(我稱爲「數據點」,因爲沒有更好的術語)。

如果您必須執行這些「數據點」的某些聚合,例如在較長時間段內查找全局最小值,我會建議爲此設計一個額外的組件。所以你最終會得到一個數據收集組件,它主要由一個'類的列表'和一個聚合組件組成,它可以利用不同的數據結構,但是處理你的'類的列表'的一部分(比如,全球最低限度是可以找到的)。

+0

謝謝,對我也有幫助。 – user2423086

0

您還可以存儲值和統計放在一個班,做對飛的計算增加一個新值(以Java示例)時:

public class YourClass { 
    private List<Integer> values = new ArrayList<Integer>(); 

    private long sum = 0; 
    private int minimum = Integer.MAX_VALUE; 
    private int maximum = Integer.MIN_VALUE; 
    // add more stuff you need 

    public synchronized void add(Integer value) { 
     values.add(value); 
     sum += value; 

     if (value < minimum) { 
      minimum = value; 
     } 

     if (value > maximum) { 
      maximum = value; 
     } 
    } 

    public List<Integer> getValues() { 
     return Collections.unmodifiableList(values); 
    } 

    public long getSum() { 
     return sum; 
    } 

    public long getAvg() { 
     return values.isEmpty() ? 0 : sum/values.size(); 
    } 

    public int getMaximum() { 
     return maximum; 
    } 

    public int getMinimum() { 
     return minimum; 
    } 
} 
+0

謝謝。誠然,問題中提到的屬性(實際上還有更多)具有數學屬性,可以隨時更新每個新數據點。然而,更多涉及的屬性確實需要明確的所有數據點。我想保留代碼以便稍後包含這些屬性。 – user2423086

0

在你的情況,數據

名單
struct Statistic{ 
    int max; 
    int min; 
    std::vector<int> points; 
    int average; 
}; 

int main(){ 
    std::vector<Statistic> stats; 
    return 0; 
}