2013-06-05 36 views
2

我不喜欢这个功能的外观。如果没有“魔术弦”,有没有办法让它看起来不那么丑陋?这个表达式是否需要优化?

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); 
} 
+0

这很长,但很容易看出它是通过确保部件总和实际等于存储的总数来测试一致性。我的代码中没有看到任何“[magic strings](http://stackoverflow.com/questions/11099876/avoiding-magic-strings-and-numbers)”。 –

+7

当人们说“优化”时,他们的意思是让代码运行得更快,或者使用更少的内存。有时使代码本身占用更少的空间。使其更具可读性只是叫它更具可读性。 –

+0

您可以插入空格以使'!='(和)部分排列起来。这可能会使它在视觉上不那么丑陋,尽管在需要属性匹配以使方法正确的意义上仍然是“丑陋的”。这可以通过使用“魔术串”的单元测试来保证。 –

回答

5

我认为通过“优化”,你的意思是“减少冗余”又名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))); 
+0

这看起来不错。非常感谢你。 – Causarium

1

你可以提取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的想法,它甚至允许从外部注入附加条件。