我目前的任务是清理,修复错误并优化winforms中的表单(一个.cs
文件中的3000行代码,这有点难看!)。我已经注意到了一些明显的不良做法和一些冗余的电话,我可以相对轻松地解决这个问题。
然而,有一个出现了很多,在我看来似乎是不好的做法,但我实际上无法用任何文档备份它。我可能完全错了。
private void datePicker_DateChanged(object sender, EventArgs e)
{
tabControl_SelectedIndexChanged(sender, e);
}
private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
tabControl_SelectedIndexChanged(sender, e);
}
我首先关注的是该方法将具有sender
对象,即日期选择器或组合框,但这有关系吗?我问自己,那里的发件人对象是什么?也许这就是为什么它在那里?我发现EventArgs
本身对我来说是非常无用的(我知道),除非该类是继承的。
我知道sender
方法中没有使用EventArgs
或tabControl_SelectedIndexChanged
,因此代码运行正常。当一些代码被更改时,未来可能会有什么影响呢?
我应该将这些更改为3个不同的事件处理程序,这些处理程序都指向一个简单的void loadCurrentTab()
方法吗?或许我应该让所有3个控件调用相同的事件处理程序,例如loadCurrentTab(sender, e)
?或者只是保持原样?这很重要吗?
答案 0 :(得分:3)
我应该将这些更改为3个不同的事件处理程序,这些处理程序都指向一个简单的void loadCurrentTab()方法吗?
在这种情况下,这实际上是我的偏好。这使得意图非常清晰 - 所有三个事件处理程序都路由到一组逻辑,这些逻辑(按设计)不关注发件人或EventArgs
。
答案 1 :(得分:2)
调用事件处理程序的最大问题(除了它是糟糕的做法)是当你快速浏览一下调用堆栈时,在你的情况下,你会看到选项卡的选定索引在没有的情况下发生变化实际上发生了。
在方法调用中没有未使用的参数也是一种好习惯。有一些例外(一个事件处理),但对于我写的任何代码,我尽量确保我总是使用我提供的。
答案 2 :(得分:2)
首先,它并不是那么重要。考虑不修复未破坏的东西。
首选方法是让几个处理程序都调用一个特殊方法(而不是一个事件处理程序)。
private void datePicker_DateChanged(object sender, EventArgs e)
{
// tabControl_SelectedIndexChanged(sender, e);
RefreshCurrentTabControl();
}
答案 3 :(得分:0)
调用其他EventHandler显然不是很好的实践。如果tabControl_SelectedIndexChanged
时间发生变化并且开始取决于发件人,那么所有代码都会失败或明星工作未成功..
我会像你说的那样在第三种方法中分离相同的逻辑。loadCurrentTab()
。您还可以考虑使用一些命令模式来处理事件 - >将业务逻辑与GUI分离的好方法。
例如:
interface ICommand {
void Execute();
}
interface IEventCommand : ICommand {
void Execute(object sender, EventArgs e);
}
class CommandAttribute : Attribute {
...
}
class MyCommand : IEventCommand {
...
}
实现一些管理器,执行器,使用反射附加命令等...
然后你可以附上这样的命令:
[Command(typeof(MyCommand), new [] {"Click"})]
private Button m_oButton = new Button();
所有nessesary参数都是自动神奇的;)传递给命令。
答案 4 :(得分:0)
是的,这是不好的做法,你在一个人中挣扎,在无知中打破另一个,经典错误就像((ComboBox)发送者).SomeProperty一样简单,因为“它只能从Combobox调用”。
取决于你能承受多大程度的重构,但我的即时反应至少是“RefreshTabControl”才能完成工作,然后让eventHandlers调用它。如果你必须对此进行扩展,即Sender或EventArgs很重要,那么建议的某种形式的委托,或者不如你所拥有的聪明但更好,将是一种过载。
e.g void RefreshTabControl(Combobox argBox,EventArgs e) 然后在事件处理程序中进行强制转换和空检查,至少这将是意图声明。
你现在所拥有的是一个等待发生的错误。