类列表与列表类

时间:2013-05-26 20:52:03

标签: oop

我有一个OOP设计问题。

让我们假设我有一个类包含几个数字标量属性,如最大值,最小值,频率等。由于数据连续流入,我最终得到了这样的类实例的列表。例如,获取全局最小值I遍历列表中的所有类以找到它。

或者,我可以实例化一个类(可能是单例),其中包含每个属性的列表而不是标量,以及循环遍历列表的函数成员。然而,这种方法似乎生成的代码看起来更像程序而不是面向对象的编程。

问题是:哪些标准定义了哪种方法可供选择?如果效率很重要,我应该选择一个包含每个属性列表的类吗?如果可读性是关键,我应该选择一个类列表吗?

感谢您的建议。

5 个答案:

答案 0 :(得分:1)

基本上你问你是否更喜欢“阵列结构(AoS)”或“阵列结构(SoA)”

答案取决于您需要对此数据执行的操作。如果你想编写一个比结构数组更可读的代码,如果你想使用SSE或CUDA来优化计算量很大的代码,那就选择一个数组结构。

如果你在文献中搜索术语“结构阵列(AoS)”和“阵列结构(SoA)”,你会发现很多关于这个主题的深度论文,我只是在这里链接一些讨论:

答案 1 :(得分:1)

您在询问决策标准。我建议一个:

您应该考虑应用程序中数据点的构成。假设您正在测量值,并且一个数据点由几个数值属性组成。那么你肯定需要一个类列表,其中类表示所有属性(由于缺少更好的术语,我称之为“数据点”)。

如果您必须对这些“数据点”进行某些聚合,例如在较长时间内找到全局最小值,我建议为此设计一个额外的组件。所以你最终会得到一个数据收集组件,它主要由一个“类列表”和一个聚合组件组成,它可以使用不同的数据结构,但是处理你的“类列表”的一部分(比如,哪个部分)找到全球最小值。)

答案 2 :(得分:0)

基本上,OOP不是编程中每个问题的解决方案,有时你必须在此之外看到。问题是你必须专注于这个问题。效率应该更优选。但是如果你的代码需要花费太多时间来加载,或者你可以说它的时间复杂度太高,那么你就会遇到麻烦。你必须保持双手掌握。我更喜欢的是列表而不是列表类。但不同的人有不同的观点,所以我们应该尊重他们。为什么我要选择类列表因为,我会让每个对象都有受尊重的数据,比如说,我有一个频率较高的对象,一个较低的对象,一个具有中等的对象,它将更容易管理所有这些,加上不是将花费很多时间。我认为在这两种情况下它都是O(n),其中n是我的情况下的元素或类的数量。

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

在您的情况下,数据列表

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

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