2010-04-25 64 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.

相關問題