【问题标题】:how can I build this method in a more concise way?如何以更简洁的方式构建此方法?
【发布时间】:2015-10-17 18:44:43
【问题描述】:
def self.sort(_sort_items, _collection)
  return _collection unless _sort_items

  _collection.sort! do |first_item, second_item|
    side_one = []
    side_two = []

    _sort_items.each do |sort_item|
      a = first_item.send(sort_item.item_name)
      b = second_item.send(sort_item.item_name)

      if sort_item.descending
        side_one << b
        side_two << a
      else
        side_one << a
        side_two << b
      end
    end

    side_one <=> side_two
  end
end

我想用更简洁/时尚的方式来写这个方法

排序方法说明:

#sort 方法接受一个集合并按多个属性排序。

如果我有这样的@collection

@sort_items:

@sort_items.add_item(:gender, true)
@sort_items.add_item(:age, false)

如果我执行:

MyClass.sort(@sort_items, @collection)

我会得到:

同一个集合首先由gender desc 排序,然后由age asc 排序。

我使用的是纯 ruby​​,但包括 Active Support

【问题讨论】:

  • 当你说sort_item.descendant时,你的意思是说sort_item.descending吗?
  • 哦!是的,我的英语很差......
  • 如果arr是一个包含两个元素的数组,其元素是age(一个Fixnum)和gender(一个字符串),你可以先按性别降序排序,然后再按年龄升序排序(打破平局)如下:arr.sort_by { |a,g| [g,-a] }.reverse.
  • ...或arr.sort_by { |a,g| [(g=='M') ? 'F' : 'M', a] }
  • 在我的情况下,arr 可以包含两个或多个项目

标签: ruby coding-style activesupport


【解决方案1】:

至于简洁和风格,您的代码实际上看起来还不错。它组织良好且可读性强。

我确实看到了一种优化性能的方法:如果我正确理解了该方法,那么如果您有平局(即被比较的两个项目相同),您应该只需要进入 _sort_items 的下一个级别:“F”与“F”)。因此,只要 2 件商品不同,您就可以提前退货:

_sort_items.each do |sort_item|
  a = first_item.send(sort_item.item_name)
  b = second_item.send(sort_item.item_name)

  if sort_item.descending
    side_one << b
    side_two << a
  else
    side_one << a
    side_two << b
  end

  return side_one <=> side_two if a != b
end

我唯一的其他建议是注意方法太长。这一行超过 20 行,你应该考虑将一些逻辑分离到一个单独的方法中。也许是这样的:

_sort_items.each do |sort_item|
  a = first_item.send(sort_item.item_name)
  b = second_item.send(sort_item.item_name)

  add_to_sides(a, b, side_one, side_two)
  return side_one <=> side_two if a != b
end

.
.
.
def add_to_sides(a, b, side_one, side_two)
  .
  .
  .
end

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2023-04-04
    • 2011-04-23
    • 1970-01-01
    • 2012-05-08
    • 2021-07-21
    相关资源
    最近更新 更多