事件处理的一般最佳实践(方法)

本文关键字:方法 最佳 事件处理 | 更新日期: 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中的逻辑越少,工作就越容易。