2016-06-27 4 views
0

나는 C#을 아주 새로운 오전 한 프로그램의 괴물에서 반복되는 코드의 다음 코드를 가지고 : 당신이 볼 수 있듯이변수를 변경하여 코드 리팩토링?

private void subjectBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string[] igcseSubjects = new string[5] {"IGCSE Maths", "IGCSE English", "IGCSE Chem", "IGCSE Phys", "IGCSE Bio"}; 
     string selectedSubject = (string) subjectBox1.SelectedItem; 
     if (igcseSubjects.Contains(selectedSubject)) 
     { 
      nBox1.Visible = aBox1.Visible = mBox1.Visible = eBox1.Visible = false; 
      cBox1.Visible = true; 
      maxBox1.Text = "100"; 
     } 
     else 
     { 
      nBox1.Visible = aBox1.Visible = mBox1.Visible = eBox1.Visible = true; 
      cBox1.Visible = false; 
      maxBox1.Text = "20"; 
     } 

    } 

    private void subjectBox2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string[] igcseSubjects = new string[5] { "IGCSE Maths", "IGCSE English", "IGCSE Chem", "IGCSE Phys", "IGCSE Bio" }; 
     string selectedSubject = (string)subjectBox2.SelectedItem; 
     if (igcseSubjects.Contains(selectedSubject)) 
     { 
      nBox2.Visible = aBox2.Visible = mBox2.Visible = eBox2.Visible = false; 
      cBox2.Visible = true; 
      maxBox2.Text = "100"; 
     } 
     else 
     { 
      nBox2.Visible = aBox2.Visible = mBox2.Visible = eBox2.Visible = true; 
      cBox2.Visible = false; 
      maxBox2.Text = "20"; 
     } 
    } 

이 두 이벤트 핸들러는 정확한 복제본을 뺀 컨트롤러 변수 이름. 실제 프로그램에는 이와 같이 더 많은 이벤트 처리기가 있으며 손에서 벗어납니다.

나는이 복사/붙여 넣기가 없어도 동일한 결과를 얻을 수있는 방법이 있다고 확신하지만 다른 변수 이름을 처리하는 방법을 알 수는 없습니다. 하나의 방법을 사용할 수 있습니까?

이 코드를 반복적으로 리팩터링 할 수 있습니까?

+0

nBox 및 cBox 컨트롤에서 유일한 차이점은 무엇입니까? – Aphelion

답변

3

기본적으로 모든 SubjectBox 컨트롤에 대해 단일 이벤트 처리기 구현 메서드를 사용할 수 있습니다. 이벤트를 보낸 사람에 따라 논리에 사용할 다른 컨트롤을 결정할 수 있습니다.

이 경우 몇 가지 설명이 있습니다. 양식이 복잡해 보이거나 모든 상자에 대해 노출 속성이 UserControl 개로 나타날 수 있습니다.

private void SubjectBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     SubjectBox_SelectedIndexChangedImpl((SomeBox)sender, aBox1, nBox1, cBox1, mBox1, maxBox1); 
    } 

    private void SubjectBox2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     SubjectBox_SelectedIndexChangedImpl((SomeBox)sender, aBox2, nBox2, cBox2, mBox2, maxBox2); 
    } 

    private void SubjectBox_SelectedIndexChangedImpl(SomeBox sender, SomeBox aBox, SomeBox nBox, SomeBox cBox, ......) 
    { 
     string[] igcseSubjects = new string[5] { "IGCSE Maths", "IGCSE English", "IGCSE Chem", "IGCSE Phys", "IGCSE Bio" }; 
     string selectedSubject = (string)subjectBox.SelectedItem; 
     if (igcseSubjects.Contains(selectedSubject)) 
     { 
      nBox.Visible = aBox.Visible = mBox.Visible = eBox.Visible = false; 
      cBox.Visible = true; 
      maxBox.Text = "100"; 
     } 
     else 
     { 
      nBox.Visible = aBox.Visible = mBox.Visible = eBox.Visible = true; 
      cBox.Visible = false; 
      maxBox.Text = "20"; 
     } 
    } 
+1

개인적으로이 솔루션은 매우 나쁘다고 생각합니다. if가 15 개의 컨트롤에 의해 호출 될 때 if리스트는 인상적 일 것입니다. – Steve

+0

나는 여기에 당신의 제안과 함께 갈 것이라고 생각합니다 -이 같은 이벤트 처리기가 필요한 8 개의 컨트롤이 있습니다. 당신의 도움을 주셔서 감사합니다! – Nemo