使用更改变量重构代码?
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";
}
}
我是 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";
}
}