如何以更简洁的方式构建此方法?

时间:2015-10-17 18:44:44

标签: ruby coding-style activesupport

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这样的话:

source collection

@sort_items

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

如果我执行:

MyClass.sort(@sort_items, @collection)

我会得到:

sorted collection

首先按gender desc排序,然后按age asc排序。

  

我使用纯红宝石,但包括Active Support

1 个答案:

答案 0 :(得分:0)

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

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

_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