假设我有一个美国州的对象,我想对该对象的某些属性执行批量更新,比如人口普查数据。我看到两个选择:
有一个单独的对象执行批处理操作,并查找并循环遍历所有状态实例,更新每个状态
某种函数,如State.new.parse_census,它不具有任何状态信息,但可以通过并更新数据库。
对不起,这是一个新问题。我假设前者更清洁,更正确,但我想确保我没有用这个假设犯设计错误。感谢..
答案 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方法。