2013-06-05 4 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

오래되었지만 부품의 합계가 실제로 저장된 총계와 일치하는지 확인하여 일관성을 테스트하는 것이 쉽습니다. 그리고 당신의 코드에서 "[마법 문자열] (http://stackoverflow.com/questions/11099876/avoiding-magic-strings-and-numbers)"을 보지 못했습니다. –

+7

사람들이 "최적화"라고 말하면 코드를 빠르게 실행하거나 메모리를 적게 사용한다는 의미입니다. 때로는 코드 자체가 공간을 덜 차지하게 만듭니다. 더 읽기 쉽도록 만드는 것은 더 쉽게 읽을 수 있도록 만들어졌습니다. –

+0

공백을 삽입하여'! ='(및 on) 부분을 정렬 할 수 있습니다. 그것은 시각적으로 덜보기 흉하게 만들지 만 올바른 방법을 찾기 위해 속성을 필요로한다는 의미에서 여전히 "못 생겼습니다". 그것은 "마법의 끈"을 사용하는 단위 테스트에 의해 보장 될 수 있습니다. –

답변

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 아이디어가 마음에 들면, 외부에서 추가 조건을 주입 할 수도 있습니다.

관련 문제