重构是好的,但有时候解决如何重构并确实是否可以实际重构某些内容并不容易!
我有许多几乎相同的方法 - 我可以重构它们,但重构的一部分超出了我的逻辑.
这是两个未重构的方法:
private void projectToolStripMenuItem_Click(object sender, EventArgs e)
{
if (projectToolStripMenuItem.Checked)
{
projectToolStripMenuItem.Checked = false;
if (!projectForm.IsDisposed) projectForm.Hide();
}
else
{
if (projectForm.IsDisposed)
projectForm = new frmProject();
projectForm.Show(dockPanel, DockState.DockRight);
projectToolStripMenuItem.Checked = true;
}
}
private void logginToolStripMenuItem_Click(object sender, EventArgs e)
{
if (logginToolStripMenuItem.Checked)
{
logginToolStripMenuItem.Checked = false;
if (!outputForm.IsDisposed) outputForm.Hide();
}
else
{
if (outputForm.IsDisposed)
outputForm = new frmOutput();
outputForm.Show(dockPanel, DockState.DockBottom);
logginToolStripMenuItem.Checked = true;
}
}
Run Code Online (Sandbox Code Playgroud)
使用Refactoring,我会得到一个这样的方法,以前的未重构方法会调用
private void refactoredMethod(TooStripMenuItem menuItem, DockContent frmName)
{
if (menuItem.Checked)
{
menuItem.Checked = false;
if (!frmName.IsDisposed) frmName.Hide();
}
else
{
if (frmName.IsDisposed)
frmName= new frmProject(); // Still Problematic
frmName.Show(dockPanel, DockState.DockRight);
menuItem.Checked = true;
}
}
Run Code Online (Sandbox Code Playgroud)
那么我们有一个几乎完全重构的方法 - 有一个问题,我如何判断form我希望从frmName变量中实例化哪个?
您可以使方法通用并利用new()通用约束.
private TForm refactoredMethod<TForm>(TooStripMenuItem menuItem, TForm frmName) where TForm : Form, new()
{
if (menuItem.Checked)
{
menuItem.Checked = false;
if (!frmName.IsDisposed) frmName.Hide();
}
else
{
if (frmName.IsDisposed)
frmName= new TForm();
frmName.Show(dockPanel, DockState.DockRight);
menuItem.Checked = true;
}
return frmName;
}
Run Code Online (Sandbox Code Playgroud)
所以你可以称之为
projectForm = refactoredMethod<frmProject>(projectToolStripMenuItem, projectForm);
Run Code Online (Sandbox Code Playgroud)
一个限制是您的表单应该有一个公共无参数构造函数.如果您有Form参数化构造函数,则可以传递Func<TForm>给充当工厂方法的方法.
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |