2010-04-25 8 views
5

Tengo un método que tiene este aspecto:hay una manera de eliminar la duplicación en este código

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; 
    } 

y tengo otro método que tiene este aspecto para consolidar esto como lo único diferente son los nombres de las propiedades?

+0

¿Qué versión de .NET estás usando? Puedo pensar en algunas formas geniales de hacerlo en .NET 4. – sblom

+0

Si tiene muchas de esas propiedades, puede usar reflection (PropertyDescriptor). Tiende a ser lento y no vale si solo tiene 2-3 propiedades. – dbkk

+0

@sblom - 3.5 es la versión de dotnet – leora

Respuesta

12

Hacer un separada GetServing método:

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

Puede cortar una línea con 'return (serving == null)? 0: serving.X' – dbkk

+3

+1. Me gusta esto un poco mejor que el enfoque lambda de Dimitrov, porque su camino está más centrado en el significado, en lugar de en la mecánica del programa. – Joren

+0

+1 Para la claridad del código, y no solo la elegancia. – 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; 
} 

que podría ser utilizado como esto:

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

Observación: SomeType es del tipo de los que Servings[0] si entiendo correctamente su código debe ser el mismo que el tipo de parser.Parse(Description).

+0

Inteligente y limpio, pero tengo una tala, está usando un gran martillo en una uña muy pequeña. – dbkk

0

Suponiendo parser.Parse() devuelve la misma clase que sostiene Servings[], se podría crear una null object de ese tipo, por lo que tanto X & Y son cero. Entonces podría tener una función que devuelve el primer elemento de Servings[], si existe, o new FoodDescriptionParser.Parser(Description), si Description existe, o, por último, ese objeto nulo. Y reúna la X o Y según sea necesario.

Cuestiones relacionadas