【问题标题】:Array of objects vs Object of arrays对象数组与数组对象
【发布时间】:2015-11-13 13:25:24
【问题描述】:

我有一个对象,它表示地图上某个点的计算结果。

class Radiation
  attr_accessor :node
  attr_accessor :hash_of_results
  others....

  def initialize(node, sky, weather, etc.)
  ....
  end

  def calculations
   ......
  end
end

在我的代码中,我可以拥有数千个这样的对象。另一种解决方案是

class Radiation
  attr_accessor :node
  attr_accessor :hash_of_results

  def initialize(*node, sky, weather, etc.)
  ....
  end

  def calculations
   ......
  end
end

在这种情况下,辐射表示整个场,因为我传递了一个节点数组,而其他变量(天空、天气等)完全相同。

我的问题是:这两种方法中哪一种在内存和性能方面更好?它们是等价的吗?也许我天真地倾向于认为第二种方法应该更好,因为使用第一种解决方案我必须创建更多这些对象的实例。

【问题讨论】:

    标签: arrays ruby oop


    【解决方案1】:

    Donald Knuth 有一句名言:“程序员会浪费大量时间来思考或担心程序中非关键部分的速度,而这些效率上的尝试实际上会对调试和维护产生强烈的负面影响。考虑过。我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。但我们不应该放弃关键的 3% 的机会。”

    您的问题并非特定于 Ruby。它属于对象建模的领域,而不是特定的编程语言。因此,如果我是你,我会先建立一个坚实的领域模型,实现手头的一些任务。一旦完成,如果出现任何问题,就可以继续进行优化。而且我可以根据我的经验告诉你,其中大多数是你现在没有预料到的。

    说到设计,我向您推荐 Eric Evans 的一本精彩的经典著作,不出所料地称为“领域驱动设计”。

    现在更具体地针对您的问题。

    1. 创建更少内存占用的对象显然会节省一些内存。您是否应该为此牺牲设计清晰度?怀疑。
    2. 就我对您的问题的了解,在我看来应该有更多的课程。一个很好的起点是看一下该领域的实际过程是如何发生的,提取名词和动词并使用它们。例如,类可以是:

      • RadiationMeasurement – 某个点的辐射值,轻量级结构
      • EnvironmentalConditions – 你命名的 skyweather 等放在此处
      • RadiationCondition – 一个对象,其中包含 EnvironmentalConditions 的值对象和 RadiationMeasurement 值对象的数组。

      我很确定这种分解对你来说完全是一派胡言,因为你比我更了解你的领域,但它应该提供一个整体想法的基本示例。这种方法的优点在于,大多数情况下,从计算的角度来看,它只需进行一些合理的调整即可高效。

    希望这是有道理的,至少有一点帮助!

    【讨论】:

    • 感谢您的详尽回答。我同意这个问题更普遍,但我认为这可能是 Ruby 的一些特殊性。我完全同意你不牺牲好的设计。实际上,我正在重写几乎从零开始的代码,以使其更加面向对象。这就是为什么我已经开始考虑与性能相关的问题。顺便说一句,我买了你推荐的书。我刚刚完成了 Practical OO Design in Ruby,我正在尝试应用书中的建议。
    • 我很高兴我的回答变得有用!顺便说一句,当谈到分析时,最好的(唯一的?)方法就是在你的应用程序将要运行的确切环境中设置一个实验并进行一些测量。例如。一个 Ruby 实现/版本适用的内容可能与另一个不同,适用于 MacOS X 的内容可能无法在 Windows 等中表现良好。
    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多