对象数组与数组对象

时间:2015-08-20 03:38:31

标签: arrays ruby oop

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

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

在这种情况下,Radiation表示整个字段,因为我传递的是节点数组,其他变量(天空,天气等)完全相同。

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

1 个答案:

答案 0 :(得分:2)

Donald Knuth的一句名言:"程序员浪费了大量时间思考或担心程序中非关键部分的速度,而这些效率尝试实际上有很大的负面影响考虑调试和维护时的影响。我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该在那个关键的3%中放弃我们的机会。"

您的问题不是特定于Ruby的。它属于对象建模领域,而不是特定的编程语言。因此,如果我是你,我会先构建一个可靠的域模型,然后实现一些任务。完成此操作后,如果出现任何问题,可以继续进行优化。而且我可以根据我的经验告诉你,他们中的大多数你现在都没有预料到。

说到设计,我推荐给你一本精彩的经典书籍,埃里克·埃文斯不出所料地叫做“领域驱动设计”#34;

现在某些问题更具针对性。

  1. 创建较少内存占用较少的对象显然可以节省一些内存。你应该牺牲设计的清晰度吗?怀疑如此。
  2. 对于我对你的问题的了解,在我看来应该有更多的课程。一个好的开始是看看实际过程是如何在现场发生的,提取名词和动词并与它们一起使用。例如,类可以是以下内容:

    • RadiationMeasurement - 某个点的辐射值,轻量级结构
    • EnvironmentalConditions - 您将skyweather等命名为
    • RadiationCondition - 一个包含EnvironmentalConditions值对象和RadiationMeasurement值对象数组的对象。

    我很确定这种分解对你来说完全是胡说八道,因为你知道你的区域比我更好,但它应该提供一个基本的想法。这种方法的优点在于,从计算的角度来看,它需要进行一些合理的调整才能提高效率。

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