论坛首页 综合技术论坛

为什么不能更懒一些?

浏览 2554 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-24  
我很喜欢Lazy Loading。但是为什么不能更懒一些呢?比如Lazy Query:

AllAuthors allAuthors = God.giveMe(AllAuthors.class);
SomeAuthors someAuthors = allAuthors.findAuthorsWhoseBirthdayBetween(1960, 1975);
AllArticles allArticles = God.giveMe(AllArticles.class);
SomeArticles someArticles = allArticles.findArticlesByItsAuthor(someAuthors);
Iterator<Article> iterator = someArticles.iterate();
while(iterator.hasNext()) {
 Article article = iterator.next();
 System.out.println(article.getTitle() + ", " + article.getAurthor().getName()):
}


SELECT Article.Title, Author.Name From Article, Author Where Article.AuthorId = Author.Id AND Aurthor.Birthday BETWEEN 1960 AND 1975;


还可以是Lazy Insert,Lazy Update。这样可行么?
   发表时间:2007-04-24  
我觉得Lazy Load主要是用于如下条件的环境:
1、用户调用的时候还不知道哪些数据会被用到;
2、这些数据在一定的Context里是可重复利用的,加载一次后以后就不需要重新加载。

而Lazy Query,至少从你的例子里有以下问题:判断逻辑太过于复杂,最终需要的数据是文章标题和作者名称,而最早用户调用的方法则是findAuthorsWhoseBirthdayBetween、findArticlesByItsAuthor,这2个方法调用后可以支持很多查询,这样子你要缓存很多查询后的结果,不如用Lazy Load缓存Authors和Articles信息,要查询的时候你再组装查询结果。

至于Lazy Insert、Lazy Update,基本上用户调用了方法你就需要完整的实现,不会像Lazy Load可以达到不取用不着的数据的优点。当然多次更新数据库可能可以合并一些sql语句甚至可以删除掉一些无效的sql语句以提高效率(类似于编译器的优化功能),但是这个逻辑就比较复杂了,是否必要是个问题。
0 请登录后投票
   发表时间:2007-04-24  
findAuthrosWhoseBirthdayBetween和findArticlesByItsAuthor都不会去查询数据库,只会把查询的条件给记录下来。实际上就是QueryCriteria。最后要取得具体数据的时候,查询才会发生。
如果存储不是基于SQL数据库的,没有SQL这码事,代码写成这样是不是就没有异议了呢?
0 请登录后投票
   发表时间:2007-04-24  
太多重复代码,直接让上帝干活
God.findAuthorsWhoseBirthdayBetween(1960, 1975); 
God.printWhatYouFind(findArticlesByItsAuthor(someAuthors))  
上帝无所不在,还需要lazy干吗?
0 请登录后投票
   发表时间:2007-04-25  
God类是用来代替new的。因为Allxxx这样的collection都是abstract,具体的查找逻辑是由框架来做实现的。就像ActiveRecord的findBy是由框架来实现一样。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics