有极限的稀疏数组

发布于 2024-11-01 17:42:22 字数 454 浏览 5 评论 0原文

我有 AR 形式的对象数组 我想有限度地精简它们。

当前的方法看起来像:

  def rarefied_values(limit = 200)
    all_values = self.values.all
    rarefied_values = []

    chunk_size = (all_values.size / limit.to_f).ceil
    if all_values.size > limit
      all_values.each_slice(chunk_size) do |chunk|
        rarefied_values.push(chunk.first)
      end
      return rarefied_values
    else
      return all_values
    end
  end

有重构的提示吗?

I have array of objects form AR
I want to rarefy them, with limit.

Current method looks like:

  def rarefied_values(limit = 200)
    all_values = self.values.all
    rarefied_values = []

    chunk_size = (all_values.size / limit.to_f).ceil
    if all_values.size > limit
      all_values.each_slice(chunk_size) do |chunk|
        rarefied_values.push(chunk.first)
      end
      return rarefied_values
    else
      return all_values
    end
  end

Any hints for refactoring?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

洒一地阳光 2024-11-08 17:42:22
def rarefied_values(limit = 200)
  all_values = values.all
  return all_values unless all_values.size > limit
  chunk_size = all_values.size / limit
  (0...limit).map{|i| all_values[i*chunk_size]}
end

ruby self 中重构的一些一般要点

  • 通常可以省略。在某些情况下,您不能,例如 self.class。在本例中,self.values.all => values.all
  • 如果其中一个条件过程比其他过程简单得多,则首先放置该简单情况,然后使用 return 将其从代码的其余部分中删除>。在这种情况下,返回 all_values,除非 all_values.size > limit
  • 一般来说,当需要嵌套条件时,应将过程较简单的情况先分开,将复杂的情况放在最后。
  • 让代码尽可能的懒惰。在这种情况下,如果 all_values.size > 则不需要 rarefied_values = []。限制。所以把它放在条件部分。
def rarefied_values(limit = 200)
  all_values = values.all
  return all_values unless all_values.size > limit
  chunk_size = all_values.size / limit
  (0...limit).map{|i| all_values[i*chunk_size]}
end

Some general points in refactoring in ruby

  • self can be omitted usually. In a few cases, you cannot, for example self.class. In this case, self.values.all => values.all
  • If one of the conditioned procedures is much simpler compared to the others, then place that simple case first, and get rid of it from the rest of the code using return. In this case, return all_values unless all_values.size > limit
  • In general, when you need nested conditions, design it so that cases with simpler procedures split off eariler, and the complicated cases are placed toward the end.
  • Let the code be lazy as possible. In this case, rarefied_values = [] is not necessary if all_values.size > limit. So put that in the conditioned section.
寒江雪… 2024-11-08 17:42:22

这是一个简单的重构,保留相同的方法,但删除显式返回调用,并且仅在必要时执行某些转换:

def rarefied_values(limit = 200)
  all_values = self.values.all
  if all_values.size <= limit
    all_values
  else
    chunk_size = (all_values.size / limit.to_f).ceil
    [].tap{ |rare| all_values.each_slice(chunk_size){ |c| rare << c.first } }
  end
end

这是一个更快、更简洁的版本:

def rarefied_values(limit = 200)
  all_values = self.values.all      
  if (size = all_values.size) <= limit
    all_values
  else
    all_values.values_at(*0.step(size-1,(size.to_f/limit).ceil))
  end
end

Here's a naïve refactor, keeping your same methods, but removing the explicit return calls and only performing certain transformations if necessary:

def rarefied_values(limit = 200)
  all_values = self.values.all
  if all_values.size <= limit
    all_values
  else
    chunk_size = (all_values.size / limit.to_f).ceil
    [].tap{ |rare| all_values.each_slice(chunk_size){ |c| rare << c.first } }
  end
end

Here's a faster, more terse version:

def rarefied_values(limit = 200)
  all_values = self.values.all      
  if (size = all_values.size) <= limit
    all_values
  else
    all_values.values_at(*0.step(size-1,(size.to_f/limit).ceil))
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文