Oop 类别列表与类别列表

Oop 类别列表与类别列表,oop,Oop,我有一个面向对象的设计问题 让我们假设我有一个类,它包含几个数值标量属性,如最大值、最小值、频率等。由于数据不断流入,我最终得到了一个此类实例的列表。为了获得全局最小值,我在列表中的所有类上循环找到它 或者,我可以实例化一个类(可能是一个单例),它包含每个属性的列表而不是标量,以及循环列表的函数成员。然而,这种方法似乎生成的代码更像是过程性的,而不是面向对象的编程 问题是:什么标准定义了选择哪种方法?如果效率很重要,我应该选择一个包含每个属性列表的类吗?如果可读性是关键,我应该选择一个类列表吗

我有一个面向对象的设计问题

让我们假设我有一个类,它包含几个数值标量属性,如最大值、最小值、频率等。由于数据不断流入,我最终得到了一个此类实例的列表。为了获得全局最小值,我在列表中的所有类上循环找到它

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

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


感谢您的建议。

基本上,面向对象编程并不是解决编程中所有问题的方法,有时您需要看到的不仅仅是这个,而是下面这个。问题是你必须集中精力解决这个问题。效率应该更高。但是,如果您的代码需要花费太多的时间来加载,或者您可以说它的时间复杂度太高,那么您将再次遇到麻烦。你必须保持两头都在手上。我更喜欢的是类列表,而不是类列表。但是不同的人有不同的观点,所以我们应该尊重他们。我之所以选择类列表,是因为,我会让每个对象都有受尊重的数据,比如说,我有一个对象的频率更高,一个对象的频率更低,一个对象的频率更高,一个对象的频率更高,这将更容易管理所有这些,而且不会占用太多时间。我认为在这两种情况下都是O(n),其中n是我的情况下的元素或类的数量。

基本上你是在问,是否更适合使用“结构数组(AoS)”或“数组结构(SoA)”

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

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


您在询问决策标准。让我推荐一个:

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


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

您还可以将值和统计信息存储在一个类中,并在添加新值时动态进行计算(Java中的示例):

公共类您的类{
私有列表值=新的ArrayList();
私有长和=0;
private int minimum=Integer.MAX_值;
private int max=Integer.MIN_值;
//添加更多你需要的东西
公共同步空添加(整数值){
增加(价值);
总和+=数值;
如果(值<最小值){
最小值=最小值;
}
如果(值>最大值){
最大值=最大值;
}
}
公共列表getValues(){
返回集合。不可修改列表(值);
}
公共长getSum(){
回报金额;
}
公共长getAvg(){
返回值.isEmpty()?0:sum/values.size();
}
公共整数getMaximum(){
返回最大值;
}
public int getMinimum(){
返回最小值;
}
}

在您的案例中,数据列表

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

int main(){
   std::vector<Statistic> stats;
   return 0;
}
struct统计{
int max;
int-min;
std::向量点;
整数平均;
};
int main(){
向量统计;
返回0;
}

取决于您试图设计什么。请发布一些sudo代码并添加更多信息。什么课程?它们应该包含什么?您如何看待类之间的交互等等,正如@doryzidon所写:这取决于您试图完成的任务。如果您有一些高性能要求,可能需要将数据分解为列表,但是如果清晰性和易于维护是一个优先事项,则可能需要执行相反的操作。请在此处询问。@msw true..这就是我试图帮助他的原因:)谢谢您的回答。我同意我的问题是一般性的。因此,它可能被归类为穷人。然而,我相信这个问题是合理的,并且引起了许多程序员的兴趣。在我的具体案例中,性能将是重要的,但我的主要兴趣是导致一种或另一种方法的标准。在我的下一个应用程序中,清晰度可能更重要。谢谢您的回答。我已经开始阅读了。我相信你的回答尽可能地解决了我的问题,因为它指出了一个事实,即这个问题在文献中被广泛讨论,并且没有二进制的是/否解决方案。谢谢你,对我也很有帮助。谢谢。诚然,问题中提到的属性(实际上还有更多)具有数学属性,即它们可以随每个新数据点动态更新。但是,有更多涉及的属性确实明确要求所有数据点。我希望保留代码,以便稍后包含此类属性。
struct Statistic{
   int max;
   int min;
   std::vector<int> points;
   int average;
};

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