2012-08-30 34 views
2

C#:方法级联和C#

var articles = Article 
         .OrderBy(x=> x.Name) 
         .Where(x=> x.Name.Contains(pattern)) 
         .Select(x=>new {x.Name + " (article)"}) 
         .ToList(); 

这是很好写这样在C#中,这就是所谓 “串联方式”。事实上,我不记得他们是怎么叫的,我在Jon Skeet的书中读到了它。这个想法是,每个方法都在一个新的线上,这在C#中是正常的。

Ruby呢?这是正常写:

articles = Article 
        .order(:name) 
        .where("name like ?","%#{pattern}%") 
        .map(&:name) 
        .map {|c| c << " (article)"} 
+1

我相信这个术语是:流畅的接口(或方法链接)。 '''''''''''''''''' - 我认为这不是它的要点,但我同意在格式化时它更具可读性:) –

+0

我总是这样做以提高可读性。可读性通常是常规的。 –

回答

2

主观的问题,所以她是一个主观的答案(例如Ruby程序员):

  1. 我不想打造“洞”,在我的代码我不会插入该级别的缩进。

  2. 你也可以在行尾插入点。哪个更具可读性?很难说,我更喜欢后者(尽管我不介意在这一行开头,这不是什么大问题)。所以,我可能会写(注意,这两个地图可以参加):

    article_names = Article. 
        order(:name). 
        where("name LIKE ?", "%#{pattern}%"). 
        map(&:name). 
        map { |name| name + " (article)"} 
    
  3. 以我的经验,长链使代码更难跟踪。当链长太多(?5,6元)我倾向于打破它创造有意义的名称中间变量,这有助于我进一步描述的表达:

    filtered_articles = Article.order(:name).where("name LIKE ?", "%#{pattern}%") 
    names = filtered_articles.map { |article| "#{article.name} (article)" } 
    
3

方法链是一种主食包括Ruby在内的许多语言。它的使用很大程度上是个人品味的问题,有些人喜欢tokland,不喜欢可能导致的大表情,而我会乐意扩大表情以消除临时变量。

+0

我也是这样做的。垂直分割的链条有助于保留@tokland喜欢的更短的块,而不需要中间/临时变量。我把它比作格式化SQL代码到它的组件子句中。 –

+0

只是为了澄清,我也喜欢和使用一个每行表达式链,只有当它变得太大我做一些分裂。但是我没有看到中间变量的问题,它们通常有助于理解随后的步骤(使用函数式时,表达式可能会链接到无穷大)。 – tokland