使用更改变量重构代码?

Refactoring Code with Changing Variables?

我是 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";
        }
    }

如您所见,这两个事件处理程序是完全相同的副本,只是减去了控制器变量名称。实际的程序有更多的事件处理程序,就像这些一样,并且正在失控。

我 99% 确定有一种方法可以在没有所有这些的情况下实现相同的结果 copy/pasting,但无法弄清楚如何绕过不同的变量名称 -- 我可以使用一种方法吗?

我怎样才能重构这段代码,使其不那么重复?

基本上,您可以对所有 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";
        }
    }