2016-02-25 85 views
2

我必須爲我的C#編程評估創建一個評分系統,並且我正在嘗試重構冗餘代碼。重構If語句

foreach (Student item in mark) 
{ 
    if (ComboBoxGradeMethod.SelectedIndex == 0) 
    { 
     item.Grade = vetMethod.VETGrade(item.Mark); 
    } 
    else if (ComboBoxGradeMethod.SelectedIndex == 1) 
    { 
     item.Grade = newVETMethod.VETGrade(item.Mark); 
    } 
    else if (ComboBoxGradeMethod.SelectedIndex == 2) 
    { 
     item.Grade = gradeMethod.CollegeGrade(item.Mark); 
    } 
    else 
    { 
     MessageBox.Show("Please select a grading scheme."); 
    } 
} 

在此'for each'循環中有3個if語句。我的一位朋友說我可以通過創建一個方法並傳遞一個函數作爲參數來減少代碼。

我是一名初學者程序員,他所說的現在有點超出我的意思。 我想知道如何去做這件事? 我不想整個答案,只是怎麼去做。

+1

這是你是否將其移動到一個方法的風格問題。但是,他會這樣描述:'public void AssignGrade(Student item){}'。此方法將包含除「foreach」之外的所有內容。然後你會重寫foreach:'foreach(學生項目在標記){AssignGrade(項目); }'。我不相信這是一個很大的改進,除非你現在的方法很大。 – Rob

+4

你應該把'if'語句移到循環之外。目前,如果您不選擇評分方案,您會收到很多消息框。 – Blorgbeard

回答

5

假設item.Markintitem.Gradestring那麼這是我會怎麼做:

var gradeFromMarkMethods = new Dictionary<int, Func<int, string>>() 
{ 
    { 0, vetMethod.VETGrade }, 
    { 1, newVETMethod.VETGrade }, 
    { 2, gradeMethod.CollegeGrade }, 
}; 

Func<int, string> gradeFromMark; 
if (gradeFromMarkMethods.TryGetValue(ComboBoxGradeMethod.SelectedIndex, out gradeFromMark)) 
{ 
    foreach (Student item in mark) 
    { 
     item.Grade = gradeFromMark(item.Mark); 
    } 
} 
else 
{ 
    MessageBox.Show("Please select a grading scheme."); 
} 
+0

這是真棒 – Tyress

+0

@Tyress - 謝謝。我很高興你是這麼想的。 – Enigmativity

1

很少的建議。

  1. 嘗試使用switch case而不是if - else

  2. 甲級

  3. 嘗試的分配,從代碼中分離UI controls創建function,就可以得到變量的值從UI控件像ComboBoxGradeMethod,然後將它傳遞給函數。 UI將來可能會發生變化,所以最好從UI中分離業務邏輯。