如何在对象的许多实例上执行操作

时间:2011-03-23 21:46:38

标签: oop

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

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

  • 某种函数,如State.new.parse_census,它不具有任何状态信息,但可以通过并更新数据库。

对不起,这是一个新问题。我假设前者更清洁,更正确,但我想确保我没有用这个假设犯设计错误。感谢..

5 个答案:

答案 0 :(得分:1)

标准方法是在类USState中创建一个方法,如此

public void updateCensus(...)
{
   //do stuff to internal data
}

然后无论是什么,这个类的所有实例都会循环遍历

public class Houser
{
    ArrayList<USState> list;

    public void foo()
    {
        for(USState state : list)
        { 
           state.updateCensus(...)
        }
    }
}

这里的想法是你设计你的班级来管理自己的内部。这样,它更易于维护,可读,并且外部类不需要暴露给对象的底层结构以与其进行适当的交互。

答案 1 :(得分:0)

这样做可能是“最干净”的方法是让状态对象拥有一个容器(例如std :: vector&lt; censusdata&gt;,假设是C ++)并使用std :: foreach()迭代元素。 / p>

根据元素的大小和您选择的容器,这也将是合理有效的。

另一方面,如果性能至关重要,最好打破OOP并将每个censusdata字段存储在一个单独的连续容器中。这样,当迭代它时,缓存将更有效地工作。但是,它非常漂亮。

答案 2 :(得分:0)

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

如果你有一堆对象都具有一次改变的特定方面,那么这个部分应该被重构到它自己的所有对象所指向的类中。

因此,您有一个州类列表,您需要更新为每个州支付的税率。现在(我不知道美国是否属实)每个州都需要向政府缴纳相同的税率。因此,您应该拥有一个所有州指向的单独的TaxRate类,而不是循环遍历每个州的税率。

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

答案 3 :(得分:0)

你写了“数据库”,所以我假设你在谈论存储在(关系型?)数据库中的持久对象,对吧?在这种情况下,您的选择很大程度上取决于您的架构的外观。例如,如果您使用对象关系映射器,它可能已经为此提供了某种导航工具。如果你必须更新一百万个对象,那么绕过ORM映射器并将单个更新SQL发送到完成工作的数据库可能是个好主意,如果可能的话。

答案 4 :(得分:0)

如果您正在使用C#,那么LINQ查询就可以了。

 var states = new List<USState>; 

// ...initialize "states" here

// Update census in each state
states.Select( state => state.UpdateCensus(...) );

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