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

标签 c# refactoring

重构是好的,但有时要弄清楚如何重构以及是否真的可以重构并不是那么容易!

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

这里有两个未重构的方法:

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

通过重构,我会得到一个这样的方法,以前未重构的方法会调用它

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

所以我们有一个几乎完全重构的方法 - 有一个问题,我怎么知道哪个 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;
}

所以你可以称它为

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

一个限制是您的表单应该有一个公共(public)的无参数构造函数。如果你有 Form使用参数化构造函数,您可以传递 Func<TForm>到您的方法,它充当工厂方法。

关于c#重构两个几乎相同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29757509/

相关文章:

c# - 从 FileSystemWatcher 错误中恢复的最佳做法是什么?

c# - 在.net中创建圆形头像

c# - 请推荐一个将asp.net网站迁移到三层架构的方案

ruby-on-rails - 干燥 rails View : partial vs helper

c++ - void指针的相关性

javascript - 如何将这三个功能重构为一个?

c# - 如何在 Ajax(Post) 请求期间抛出自定义 http 状态代码

c# - 如何将 ReactiveUI 与分层数据源( TreeView )一起使用

c# - 在C#中更改System.Exception()的错误消息

ruby - 如何从Ruby方法中删除多重 yield ?