到目前为止,我将所有对事件有反应的代码直接放入事件处理方法中 昨天我看到有人提到只有最少的代码应该去那里 真的吗 ?或者最佳做法是什么?
e.g。从程序平滑工作的角度来看哪一个例子更好,以及为什么,如果你可以: FIG1:
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..
}
Fig2:
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);
}
..甚至是 图三:
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();
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
是的,你应该尽量保持最低限度。
如果大量的代码被说成是一堆内部因素(例如表单控件,但你的目标是尽可能多地在事件处理程序之外),它会变得有点混乱。
所有这些都取决于大块代码是什么,但即使是本地私有方法也比eventHandler中的大量代码更好。
如果说您正在抓取UI属性以将它们存储在另一个类中。添加一个方法,将它们作为参数。
如果有很多UI内容,请查看UserControl。
这样做的主要原因是测试UI是一个很大的痛苦,因此UI中的逻辑越少,工作就越容易。