加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#重构两个几乎相同的方法

发布时间:2020-12-15 04:18:35 所属栏目:百科 来源:网络整理
导读:重构是好的,但有时候解决如何重构并确实是否可以实际重构某些内容并不容易! 我有许多几乎相同的方法 – 我可以重构它们,但重构的一部分超出了我的逻辑. 这是两个未重构的方法: private void projectToolStripMenuItem_Click(object sender,EventArgs e) {
重构是好的,但有时候解决如何重构并确实是否可以实际重构某些内容并不容易!

我有许多几乎相同的方法 – 我可以重构它们,但重构的一部分超出了我的逻辑.

这是两个未重构的方法:

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;
        }
    }

使用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;
        }
    }

那么我们有一个几乎完全重构的方法 – 有一个问题,我怎么能告诉我希望从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;
}

所以你可以称之为

projectForm = refactoredMethod<frmProject>(projectToolStripMenuItem,projectForm);

一个限制是您的表单应该有一个公共无参数构造函数.如果你有一个带参数化构造函数的Form,你可以传递Func< TForm>作为工厂方法的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读