
我有许多几乎相同的方法 – 我可以重构它们,但重构的一部分超出了我的逻辑.
这是两个未重构的方法:
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>作为工厂方法的方法.
总结以上是内存溢出为你收集整理的c#重构两个几乎相同的方法全部内容,希望文章能够帮你解决c#重构两个几乎相同的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)