我有一个OOP设计问题。
让我们假设我有一个类包含几个数字标量属性,如最大值,最小值,频率等。由于数据连续流入,我最终得到了这样的类实例的列表。例如,获取全局最小值I遍历列表中的所有类以找到它。
或者,我可以实例化一个类(可能是单例),其中包含每个属性的列表而不是标量,以及循环遍历列表的函数成员。然而,这种方法似乎生成的代码看起来更像程序而不是面向对象的编程。
问题是:哪些标准定义了哪种方法可供选择?如果效率很重要,我应该选择一个包含每个属性列表的类吗?如果可读性是关键,我应该选择一个类列表吗?
感谢您的建议。
答案 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;
}