2010-04-25 113 views
5

我有一个看起来像这样的方法:有没有办法来消除这种代码重复

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

和我有一个看起来像这样一种方法:

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

有什么办法巩固这是唯一不同的是属性名称?

+0

您使用的是什么版本的.NET?我可以想到在.NET 4中使用一些简洁的方法。 – sblom 2010-04-25 16:40:27

+0

如果你有很多这样的属性,你可以使用反射(PropertyDescriptor)。如果只有2-3个属性,它往往是缓慢的和不值得的。 – dbkk 2010-04-25 16:40:36

+0

@sblom - 3.5是dotnet的版本 – leora 2010-04-25 16:43:28

回答

12

创建一个独立的GetServing方法:

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

你可以用'return(serving == null)'来剪一行吗? 0:serving.X' – dbkk 2010-04-25 16:47:55

+3

+1。我喜欢这个比Dimitrov的lambda方法好一点,因为你的方式更注重意义,而不是程序的机制。 – Joren 2010-04-25 17:00:44

+0

+1代码清晰,而不仅仅是智能。 – Nayan 2010-04-25 18:16:53

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

哪位能像这样被使用:

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

注:SomeTypeServings[0]其中,如果我正确地理解你的代码应该是一样的parser.Parse(Description)类型的类型。

+0

聪明干净,但我有一个感觉,这是一个非常小的指甲上使用大锤子。 – dbkk 2010-04-27 06:50:54

0

假设parser.Parse()返回相同的类Servings[]成立,你可以创建一个该类型的null object,对于是X & Y都是零。然后你可以有一个函数返回Servings[](如果存在)的第一个元素,或者new FoodDescriptionParser.Parser(Description)(如果Description存在),或者最后返回空对象。根据需要收集X或Y.

相关问题