Oop 如何对一个对象的多个实例执行操作

Oop 如何对一个对象的多个实例执行操作,oop,Oop,假设我有一个用于美国各州的对象,我想对该对象的某些属性(如人口普查数据)执行批量更新。我看到两种选择: 拥有一个单独的对象,该对象执行批处理操作,并查找和循环状态的所有实例,更新每个实例 类似State.new.parse_census这样的函数没有任何状态信息,但可以遍历并更新数据库 对不起,这是一个很新的问题。我假设前者更干净、正确,但我想确保我没有在这个假设中犯设计错误。谢谢..标准方法是在类USState中创建一个方法,如下所示 public void updateCensus(..

假设我有一个用于美国各州的对象,我想对该对象的某些属性(如人口普查数据)执行批量更新。我看到两种选择:

  • 拥有一个单独的对象,该对象执行批处理操作,并查找和循环状态的所有实例,更新每个实例

  • 类似State.new.parse_census这样的函数没有任何状态信息,但可以遍历并更新数据库


对不起,这是一个很新的问题。我假设前者更干净、正确,但我想确保我没有在这个假设中犯设计错误。谢谢..

标准方法是在类USState中创建一个方法,如下所示

public void updateCensus(...)
{
   //do stuff to internal data
}
然后,任何包含这个类的所有实例的东西都会循环通过

public class Houser
{
    ArrayList<USState> list;

    public void foo()
    {
        for(USState state : list)
        { 
           state.updateCensus(...)
        }
    }
}
public-class-Houser
{
数组列表;
公共图书馆
{
对于(美国州:列表)
{ 
state.updateSensus(…)
}
}
}
这里的想法是您设计类来管理自己的内部。通过这种方式,它更易于维护、可读,并且外部类不需要暴露于对象的底层结构,就可以与对象进行适当的交互。

实现这一点的最“干净”的方法可能是让state对象拥有一个容器(例如std::vector,假设为C++),并使用std::foreach()对元素进行迭代

根据元素的大小和您选择的容器,这也将相当有效

另一方面,如果性能至关重要,最好使用OOP,将censusdata的每个字段存储在单独的连续容器中。这样,当对其进行迭代时,缓存将更有效地工作。不过,这并不漂亮。

这可能表明您的类结构需要重构

如果您有一堆对象,它们都有一个特定的方面可以立即更改,那么这部分可能应该重构为您所有对象所指向的自己的类

所以你有一个州类别的列表,你需要更新每个州的税率。现在(我不知道这在美国是否属实)每个州都需要向政府支付相同的税率。因此,与其在每个州循环更新税率,您可能应该有一个所有州都指向的单独税率类

然后要更新,您只需要在一个位置更新TaxRate对象,所有类都会更新。

您编写了“数据库”,所以我假设您所说的是存储在(关系?)数据库中的持久对象,对吗?在这种情况下,您的选择在很大程度上取决于您的体系结构的外观。例如,如果您正在使用对象关系映射器,它可能已经为此提供了某种导航工具。如果您必须更新一百万个对象,如果可能的话,最好绕过ORM映射器,向数据库发送一个更新SQL来完成这项工作

如果您在C#工作,LINQ查询将是一个不错的选择

 var states = new List<USState>; 

// ...initialize "states" here

// Update census in each state
states.Select( state => state.UpdateCensus(...) );
var states=新列表;
//…在此初始化“状态”
//更新每个州的人口普查
states.Select(state=>state.updateSensus(…);

“Select”方法将遍历每个状态,并调用该状态的updateSensus方法。

您使用的是什么编程语言?Ruby。当只需要一个单词的答案时,为什么最少15个字符:(为什么州对象会知道如何处理人口普查数据?在我看来,它不会。糟糕的设计。@佩德罗你考虑得太狭隘了。这是OOP的一个常见陷阱。你假设州对象代表美国一个州的想法。你会有很好的理由支持糟糕的命名约定,但不支持设计。我的USStateobject并不一定代表一个美国州。它只是一个可以保存人口普查数据的例子。我认为state object代表一个美国州的原因是因为这就是原始海报上所说的,你甚至把你的班级命名为USState。你在抽什么,伙计?我能要一些吗?@Pedro是Flo州里达不负责维护其公民的人口普查数据。这难道不意味着俄勒冈州也有责任维护它吗?如果州不维护这些数据,那么谁是?州内的某个机构?或者可能是某个特定机构、州内的某个特定人……拉比洞到底有多深取决于我们不知道他的问题的参数,因此我选择了一个简单的例子,说明一个国家维护信息本身。