【问题标题】:Which is more performant, passing a method the entire object, or a property of that object?哪个性能更高,将方法传递给整个对象,还是传递该对象的属性?
【发布时间】:2012-04-08 03:02:34
【问题描述】:

考虑以下示例。

我需要检查 CouponModel 是否有唯一的序列号。

我有两个选择:

CouponModel model = GetFromSomewhere();

if (!CouponHasUniqueKey(model))
{
}

//or

if (!CouponHasUniqueKey(model.SerialKey))
{
}

当然,在我传入整个对象的方法中,我必须访问字符串属性,而不是直接使用字符串。

哪个选项更好,为什么?

【问题讨论】:

  • 这实际上与性能无关(无论如何这将是一个微优化)。您通过了该方法完成其合同所需的最小值。请参阅@Jordao 的回答:对象具有此责任可能会更好

标签: c# .net object value-type reference-type


【解决方案1】:

我相信性能会一样。

我也更愿意将责任交给对象本身:

CouponModel coupon = GetFromSomewhere();
if (!coupon.HasUniqueKey()) {
  // ...
}

【讨论】:

  • 考虑到这一点,这适用于更喜欢轻量级模型的 MVC3 应用程序。从模型中通过存储库访问数据库是一种好习惯吗?我需要这样做才能从对象中运行 HasUniqueKey 方法。
  • 只要视图和控制器永远不会看到那些数据库访问方法,那么我猜这会很好。在基本操作之前不要尝试优化,记住 KISS - 保持简短。
  • 存储库是模型的一部分,因此您的模型可以使用它。虽然,它应该是模型内部的一个接口,所以可以更好地测试它。查看here 了解一些一般信息。
【解决方案2】:

1.答案已经发布了,虽然作者心中隐藏着“问题”:

“我应该传递整个对象吗”?当他这样说时,他认为需要将一些巨大的地球传递给该方法。

大多数面向对象的编程语言(C#、java、c++ ..)并非如此

当您将对象的实例传递给方法时,您只是传递了一个引用而不是其他任何东西。

2.请注意,对象本身的属性可以是整个对象,并且可能是该属性的大小大于对象的大小。

所以回答你的问题是为了性能优势,你通过什么并不重要。

【讨论】:

    【解决方案3】:

    第二个选项更好。正如得墨忒耳法则所说。在这种情况下,不是从优化的角度出发,而是从设计的角度出发。

    http://en.wikipedia.org/wiki/Law_of_Demeter

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2011-06-30
      • 2011-09-20
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2015-08-18
      相关资源
      最近更新 更多