2010-04-25 21 views
5

Mam metodę, która wygląda tak:czy istnieje sposób, aby usunąć powielania w tym kodzie

private double GetX() 
    { 
     if (Servings.Count > 0) 
     { 
      return Servings[0].X; 
     } 
     if (!string.IsNullOrEmpty(Description)) 
     { 
      FoodDescriptionParser parser = new FoodDescriptionParser(); 
      return parser.Parse(Description).X; 
     } 
     return 0; 
    } 

i mam inną metodę, która wygląda tak:

private double GetY() 
    { 
     if (Servings.Count > 0) 
     { 
      return Servings[0].Y; 
     } 
     if (!string.IsNullOrEmpty(Description)) 
     { 
      FoodDescriptionParser parser = new FoodDescriptionParser(); 
      return parser.Parse(Description).Y; 
     } 
     return 0; 
    } 

Czy jest jakiś sposób, skonsolidować to, ponieważ jedyne co innego to nazwy nieruchomości?

+0

Jakiej wersji .NET używasz? Mogę wymyślić kilka fajnych sposobów, aby to zrobić w .NET 4. – sblom

+0

Jeśli masz wiele takich właściwości, możesz użyć odbicia (PropertyDescriptor). Ma tendencję do powolności i nie warto, jeśli to tylko 2-3 właściwości. – dbkk

+0

@sblom - 3.5 to wersja dotnet – leora

Odpowiedz

12

Zrób osobną GetServing metody:

private Serving GetServing() { 
    if (Servings.Count > 0) 
     return Servings[0]; 

    if (!string.IsNullOrEmpty(Description)) { 
     FoodDescriptionParser parser = new FoodDescriptionParser(); 
     return parser.Parse(Description); 
    } 
    return null; 
} 

private double GetX() { 
    Serving serving = GetServing(); 
    if (serving == null) return 0; 
    return serving.X; 
} 

private double GetY() { 
    Serving serving = GetServing(); 
    if (serving == null) return 0; 
    return serving.Y; 
} 
+2

Możesz wyciąć linię z 'return (serving == null)? 0: serving.X' – dbkk

+3

+1. Lubię to nieco lepiej niż podejście lambda Dymitrowa, ponieważ twoja droga jest bardziej skupiona na znaczeniu niż na mechanice programu. – Joren

+0

+1 Dla klarowności kodu, a nie tylko spryt. – Nayan

9
private double Get(Func<SomeType, double> valueProvider) 
{ 
    if (Servings.Count > 0) 
    { 
     return valueProvider(Servings[0]); 
    } 
    if (!string.IsNullOrEmpty(Description)) 
    { 
     FoodDescriptionParser parser = new FoodDescriptionParser(); 
     return valueProvider(parser.Parse(Description)); 
    } 
    return 0; 
} 

które mogłyby zostać wykorzystane tak:

var x = Get(value => value.X); 
var y = Get(value => value.Y); 

Uwaga: SomeType jest typem Servings[0] który jeśli dobrze rozumiem swój kod poprawnie powinno być takie samo jak typ parser.Parse(Description).

+0

Sprytny i czysty, ale mam wycięcie to używa dużego młotka na bardzo małym paznokciu. – dbkk

0

Zakładając parser.Parse() powraca do tej samej klasy, które Servings[] posiada, można utworzyć null object tego typu, dla których zarówno X & Y są równe zeru. Wtedy możesz mieć funkcję, która zwraca pierwszy element z Servings[], jeśli istnieje, lub new FoodDescriptionParser.Parser(Description), jeśli istnieje, lub, w końcu, ten obiekt zerowy. I zbieraj X lub Y w razie potrzeby.

Powiązane problemy