2013-06-05 65 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的想法,它甚至允許從外部注入附加條件。