事件处理的一般最佳实践(方法)
本文关键字:方法 最佳 事件处理 | 更新日期: 2023-09-27 18:27:00
到目前为止,我将所有对事件作出反应的代码直接放入事件处理方法中
昨天,我在某个地方看到有人提到,只有最低限度的代码应该放在那里
这是真的吗?或者最好的做法是什么?
例如,从程序顺利工作的角度来看,哪一个示例更好,以及为什么,如果可以的话:图1:
private void MainForm_DragDrop(object sender, DragEventArgs e)
{
var DropPosX = e.X;
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
for (int i = 0; i < s.Length; i++)
{
CheckFile(s[i])
LoadFile(s[i]);
// ..big chunk of code..
}
// ..big chunk of code..
}
图2:
DoDragDrop(int[] s, int DropPosX)
{
for (int i = 0; i < s.Length; i++)
{
CheckFile(s[i])
LoadFile(s[i]);
// ..big chunk of code..
}
// ..big chunk of code..
}
private void MainForm_DragDrop(object sender, DragEventArgs e)
{
var DropPosX = e.X;
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
DoDragDrop(s, DropPos);
}
甚至
图3:
int DropPosX;
string[] s;
DoDragDrop()
{
for (int i = 0; i < s.Length; i++)
{
CheckFile(s[i])
LoadFile(s[i]);
// ...
}
// ...
}
private void MainForm_DragDrop(object sender, DragEventArgs e)
{
DropPosX = e.X;
s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
DoDragDrop();
}
大多数事件处理程序本质上采取以下两个操作
- 从事件中收集相关数据,可能只是事件发生了
- 使用收集的数据执行操作
听起来那个人建议你把这些逻辑运算分解成两个独立的方法。这是合理的推理,但也是一个风格问题。这样做并不能使你的程序或多或少正确。尽管我通常发现,如果采用这种方法,代码更易于测试。
但这是针对这个样本的。在这种情况下,我不会使用实例变量。被拖动的项和位置与DoDragDrop
方法相关,应作为参数传递。如果该数据需要持久化,那么DoDragDrop
应该是设置实例值的数据。
private void MainForm_DragDrop(object sender, DragEventArgs e)
{
int position = e.X;
string[] items = (string[])e.Data.GetData(DataFormats.FileDrop, false);
DoDragDrop(positon, items);
}
是的,您应该尽量保持最小值。
如果说大块代码在处理大量内部事务(例如表单控件),但你的目标是在事件处理程序之外尽可能多,那么它可能会变得有点混乱。
这一切都取决于大块代码是什么,但即使是本地私有方法也比和eventHandler中的大块代码要好。
如果说您正在获取UI属性以将它们存储在另一个类中。向其中添加一个方法,将它们作为参数。
如果是大量的UI内容,请查看UserControl。
这样做的主要原因是,测试UI是一个主要的痛苦,所以UI中的逻辑越少,工作就越容易。