0

到目前为止,我将所有对事件做出反应的代码直接放入事件处理方法中。
昨天我在某处看到有人提到只有最少的代码应该去那里。
真的吗 ?或者最好的做法是什么?

例如,从程序流畅工作的角度来看,哪个示例更好,以及为什么,如果可以的话:图 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();
}
4

2 回答 2

2

大多数事件处理程序本质上采取以下两个动作

  • 从事件中收集相关数据,可能只是事件发生了
  • 使用收集的数据执行操作

听起来那个人建议您将这些逻辑操作分解为 2 个单独的方法。这是合理的推理,但也是风格问题。这样做不会使您的程序或多或少正确。虽然我通常发现如果你采用这种方法,代码更容易测试。

虽然具体到这个样本。在这种情况下,我不会使用实例变量。被拖动的项目和位置与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);
}
于 2013-08-08T21:20:59.360 回答
0

是的,你应该尽量保持最低限度。

如果说大量代码在大量内部组件(例如表单控件,但您在事件处理程序之外尽可能多地瞄准),它可能会变得有点混乱。

一切都取决于大块代码是什么,但即使是本地私有方法也比 eventHandler 中的一大块代码要好。

如果说您正在获取 UI 属性以将它们存储在另一个类中。向它添加一个方法,将它们作为参数。

如果有很多 UI 内容,请查看 UserControl。

这样做的主要原因是,测试 UI 是一件很痛苦的事情,所以 UI 中的逻辑越少,工作就越容易。

于 2013-08-08T21:29:40.157 回答