在对象中加载数据时是否有最佳做法或指南?
例如。您正在处理调查问卷。问卷包含问题。问题的数量可以在0到500之间变化。调查问卷包含一个名为GetAllQuestions()
的方法。
这是我的观点。是否建议创建一个成员变量(假设_allQuestions
类型为Collection<Question>
)并在构造函数中填充该变量?代码:
public class Questionnaire
{
Collection<Question> _allQuestions;
public Questionnaire()
{
_allQuestions = new Collection<Question>();
LoadAllQuestions();
}
public Collection<Question> GetAllQuestions()
{
return _allQuestions;
}
private void LoadAllQuestions()
{
// Some database stuff and fill _allQuestions
}
}
或者最好在提出要求时返回所有问题。代码:
public class Questionnaire
{
public Questionnaire()
{
}
public Collection<Question> LoadAllQuestions()
{
// Some database stuff
// Create and fill an object with all the questions
// return the object
}
}
在最后一种情况下,我看到了一种不满情绪。如果你将这种方法称为十次怎么办?然后,对于相同的数据,数据库被访问十次。所以在这种情况下你可以选择第一种情况。但如果删除或添加一些问题会怎么样?然后列表不一致。
这只是一个例子。当我想知道该怎么做时,还有更多的情况。我应该何时加载哪些数据。
我想知道,在为对象加载哪些数据时是否有一些指导原则或最佳做法?
答案 0 :(得分:4)
你可以做到这两点。创建对象时不要加载任何内容。在第一次请求时加载一次问题,并将它们缓存在一个字段中以供后续请求使用。
public class Questionnaire
{
Collection<Question> _allQuestions;
public Collection<Question> AllQuestions
{
get {
if (_allQuestions == null)
LoadAllQuestions();
return _allQuestions;
}
}
private void LoadAllQuestions()
{
_allQuestions = new Collection<Question>();
// Some database stuff and fill _allQuestions
}
}
答案 1 :(得分:0)
我认为这是一个需要执行“Lazy Loading”的情况,这只是在你真正需要时加载信息(在这种情况下是问题)。
当您确定加载构造函数中的问题时,每次创建Questionnaire
对象时都会访问数据库 - 如果您实际上不打算在那时使用问题,则会产生不必要的开销
“规则”(如果它可以称为规则)应该考虑加载数据与其实用程序相关的费用。在某些情况下,您将需要创建所有数据,而在其他情况下则不需要。这将取决于数据 - 这是我知道的对冲我的赌注,但这就是你可以用“现实世界”做的一切。
答案 2 :(得分:0)
这将取决于您的数据加载频率以及是否将使用数据。例如,如果您要使用调查问卷中的问题,那么最好加载完整的对象图,但是假设用户会查看调查问卷列表,并且只有当他们点击一个问题时才会看到问题然后它当你提出问题时,最好加载这些问题。
答案 3 :(得分:0)
检索您需要的数据。实现某种分页并检索您需要在当前页面中显示的问题..
答案 4 :(得分:0)
我认为你混淆了两个概念。
在构造完成时,对象应处于有效(可用)状态。但是,这与将所有数据都放在一起是不一样的。
“有效”,简单来说,可能意味着“所有属性都返回正确的值”。这可以通过延迟加载来处理,如其他答案中所述。