2012-08-30 64 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