2

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# 中是正常的。

鲁比呢?正常写吗:

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

2 回答 2

2

方法链是许多语言的主要内容,包括 Ruby。它的使用很大程度上取决于个人喜好——有些人,比如 tokland,不喜欢可能产生的大表达式,而我很乐意扩展一个表达式以消除临时变量。

于 2012-08-30T17:02:59.800 回答
1

主观问题,所以她是一个主观的答案(作为 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)" }
    
于 2012-08-30T16:51:47.563 回答