3

I have an OOP design question.

Let's assume that I have a class that contains several numerical scalar properties like maximum, minimum, frequency etc. Since data are flowing in continuously I eventually end up with a list of such class instances. To obtain, say, the global minimum I loop over all classes in the list to find it.

Alternatively, I could instantiate one class (possibly a singleton) that contains lists instead of scalars for each property, and function members that loop over the lists. This approach however seems to generate code that looks more like procedural than object oriented programming.

The question is: What criterions define which approach to choose? If efficiency is important, should I choose one class that contains lists for each properties? If readability is key, should I choose a list of classes?

Thanks for suggestions.

4

5 回答 5

1

您要求的是决策标准。让我推荐一个:

您应该考虑什么构成了应用程序中的数据点。假设您正在测量值,并且一个数据点由多个数值属性组成。那么你肯定会想要一个类列表,其中类代表所有组合在一起的属性(我称之为“数据点”,因为没有更好的术语)。

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

于 2013-05-26T21:32:22.110 回答
1

基本上,您会问是否更可取的是“结构阵列 (AoS)”或“阵列结构 (SoA)”

答案取决于您需要如何处理这些数据。如果您想编写比结构数组更具可读性的代码,如果您想使用 SSE 或 CUDA 来优化计算量大的代码,那么请选择数组结构。

如果您在文献中搜索术语“结构数组(AoS)”和“数组结构(SoA)”,您会发现许多关于这个主题的深入论文,我在这里只链接一些讨论:

于 2013-05-26T21:19:16.747 回答
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;
    }
}
于 2013-05-27T03:32:34.987 回答
0

在您的情况下,数据列表

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

int main(){
   std::vector<Statistic> stats;
   return 0;
}
于 2013-05-27T03:37:01.917 回答
0

基本上,OOP 并不是编程中所有问题的解决方案,有时你必须超越这个,低于这个。问题是你必须专注于这个问题。效率应该更可取。但是如果你的代码加载时间太长,或者你可以说它的时间复杂度太高,那么你又会遇到麻烦。你必须把两端都握在手中。我更喜欢的是类列表而不是列表类。但是不同的人有不同的观点,我们应该尊重他们。为什么我选择类列表,因为,我会让每个对象都包含受尊重的数据,比如,我有一个频率较高的对象,一个频率较低的对象,一个中等频率的对象,管理所有这些会更容易,而且不会会花很多时间。

于 2013-05-26T21:09:11.033 回答