WEB开发网
开发学院软件开发C语言 趣味编程:C#中Specification模式的实现(参考答案... 阅读

趣味编程:C#中Specification模式的实现(参考答案 - 上)

 2010-09-30 21:02:07 来源:WEB开发网   
核心提示: 用它来编写上次的示例便容易多了:staticSpec<int>MorePredicate(Spec<int>original){returnoriginal.Or(i=>i>0);}staticvoidMain(string[]args){vararray=E

用它来编写上次的示例便容易多了:

static Spec<int> MorePredicate(Spec<int> original) 
{ 
  return original.Or(i => i > 0); 
} 
 
static void Main(string[] args) 
{ 
  var array = Enumerable.Range(-5, 10).ToArray(); 
  var oddSpec = new Spec<int>(i => i % 2 == 1); 
  var oddAndPositiveSpec = MorePredicate(oddSpec); 
 
  foreach (var item in array.Where(i => oddAndPositiveSpec(i))) 
  { 
    Console.WriteLine(item); 
  } 
} 

由于有C#的扩展方法和委托,在C#中使用Specification模式比之前要容易许多。不过,在某些时候,我们可能还是需要老老实实按照标准来做。创建独立的Specification对象的好处是在一个单独的地方内聚地封装了一段逻辑,因此适合较集中,较“重”的逻辑,而“委托”则适合轻便的实现。委托的另一个优势是使用方便,但它的缺点便是难以“静态表示”。如果您在使用Specification模式时,需要根据外部配置来决定进行何种组装,那么可能只有为每种逻辑创建独立的Specification对象了。此外,使用委托还有一个“小缺点”,即它可能会“不自觉”地提升对象的生命周期,可能会形成一些延迟方面的陷阱。

当然,我并不是说独立Specification对象就不会造成生命周期延长——只要功能实现一样,各方面也应该是相同的。只不过独立的Specificaiton对象给人一种“正式”而“隆重”的感觉,容易让人警觉,因而缓解了这方面问题。

不过还有一个问题我们还没有解决——我们现在组装的是委托或Specification对象,但如果我们需要组装一个表达式树,组装完毕后交给如LINQ to SQL使用,又该怎么做呢?我们的“下”便会设法解决这个问题。

文章来源: http://www.cnblogs.com/JeffreyZhao/archive/2009/09/28/specification-pattern-in-csharp-practice-answer-1.html

上一页  1 2 3 4 

Tags:趣味 编程 Specification

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接