【问题标题】:Does this expression require optimization or not?这个表达式是否需要优化?
【发布时间】:2013-06-05 13:36:27
【问题描述】:

我不喜欢这个函数的外观。如果没有“魔术字符串”,有没有办法让它看起来不那么难看。

private static bool Inconsistent(AdStats adStat)   {
  return 
    adStat.Daily.Impressions != adStat.Hourly.Sum(h => h.Value.Impressions) ||
    adStat.Daily.Clicks != adStat.Hourly.Sum(h => h.Value.Clicks) ||
    adStat.Daily.Spent != adStat.Hourly.Sum(h => h.Value.Spent) ||
    adStat.Daily.SocialImpressions != adStat.Hourly.Sum(h => h.Value.SocialImpressions) ||
    adStat.Daily.SocialClicks != adStat.Hourly.Sum(h => h.Value.SocialClicks) ||
    adStat.Daily.SocialSpent != adStat.Hourly.Sum(h => h.Value.SocialSpent) ||
    adStat.Daily.UniqueImpressions != adStat.Hourly.Sum(h => h.Value.UniqueImpressions) ||
    adStat.Daily.UniqueClicks != adStat.Hourly.Sum(h => h.Value.UniqueClicks) ||
    adStat.Daily.SocialUniqueImpressions != adStat.Hourly.Sum(h => h.Value.SocialUniqueImpressions) ||
    adStat.Daily.SocialUniqueClicks != adStat.Hourly.Sum(h => h.Value.SocialUniqueClicks);
}

【问题讨论】:

  • 当人们说“优化”时,他们的意思是让代码运行得更快,或者让它使用更少的内存。有时使代码本身占用更少的空间。使其更具可读性只是称为使其更具可读性。
  • 您可以插入空格以使!=(及以上)部分对齐。这可能会使它在视觉上不那么难看,尽管在需要属性匹配以使方法正确的意义上仍然是“难看的”。这可以通过使用“魔术字符串”的单元测试来确保。
  • @GrantWinney,我的意思是,我可以使用反射并传递要更新的属性列表。 EdPlunkett,我真正想要的基本上是 DRY。

标签: c# .net optimization


【解决方案1】:

我认为“优化”是指“减少冗余”又名Don't Repeat Yourself

基本上,您有一堆指标。您想检查对于这些指标中的任何一个,该指标在每日基础上的值是否与该指标在每小时基础上的总和有偏差。

一旦你这么想,你就可以这样做:

Func<Stat, int>[] metricGetters = 
{
   stat => stat.Impressions,
   stat => stat.Clicks,
   // .. etc. etc.
};

return metricGetters.Any(getter => getter(adStat.Daily) 
                                != adStat.Hourly.Sum(h => getter(h.Value)));

【讨论】:

  • 看起来不错。非常感谢。
【解决方案2】:

您可以将 adStat.Hourly.Select(h => h.Value) 提取到变量中,这样可以减少代码量:

 private static bool Inconsistent(AdStats adStat)
    {
        var hourlyValue = adStat.Hourly.Select(x => x.Value);
        return
          adStat.Daily.Impressions != hourlyValue.Sum(h => h.Impressions) ||
          adStat.Daily.Clicks != hourlyValue.Sum(h => h.Clicks) ||
          adStat.Daily.Spent != hourlyValue.Sum(h => h.Spent) ||
          adStat.Daily.SocialImpressions != hourlyValue.Sum(h => h.SocialImpressions) ||
          adStat.Daily.SocialClicks != hourlyValue.Sum(h => h.SocialClicks) ||
          adStat.Daily.SocialSpent != hourlyValue.Sum(h => h.SocialSpent) ||
          adStat.Daily.UniqueImpressions != hourlyValue.Sum(h => h.UniqueImpressions) ||
          adStat.Daily.UniqueClicks != hourlyValue.Sum(h => h.UniqueClicks) ||
          adStat.Daily.SocialUniqueImpressions != hourlyValue.Sum(h => h.SocialUniqueImpressions) ||
          adStat.Daily.SocialUniqueClicks != hourlyValue.Sum(h => h.SocialUniqueClicks);
    }

我也喜欢 Ani 的想法,它甚至可以从外部注入额外的条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多