将单独方法中的事件逻辑添加到触发事件的方法中是一种好做法吗?

Is adding the logic for a event in a separated method to the one that triggers it a good practice?

例如,假设我有一个 windows 表单,其中包含一些数字文本框和一个按钮,当我单击按钮时,我想获取所有这些文本的值并使用他们。

会这样吗:

private void btnSomeResult_Click(object sender, EventArgs e) {

    DoSomeMath();

} 

比说更好的做法:

private void btnSomeResult_Click(object sender, EventArgs e) {

    //Complex math goes here.

} 

还是取决于操作的复杂程度?例如,在简单的乘法、除法等中可能不需要它。

如果要重复使用或从多个地方调用,我通常会将您的 complex math 的代码分开。 (例如,如果您需要从多个不同的按钮单击处理程序调用它)。

如果不是,没有理由将它直接放入按钮的处理程序中。

private void btnSomeResult_Click(object sender, EventArgs e) {

DoSomeMath();

}

由于以下原因,这种方法更适合

  1. 如果您的 UI 发生变化,例如将一个按钮替换为另一个也需要执行相同功能的按钮,那么您可以重用已经编写的功能。本质上,您的 UI 将独立于按钮控件的功能。

  2. 如果您从单元测试开始,您可以轻松地测试方法 (DoSomeMath)。

更好的方法是从 UI 元素中获取数据并将其传递给更具体的方法参数 class/Type 以确保数据独立于 UI 控件

   // This function reads the data from UI and call the next method which is more narrow in it's parameter type (like accepting params of type int )
    private void DoSomeMath()
    {
        // no error handling, just for demostration
        string firstNumber = int.Parse(txtBoxFirstNumer.Text);
        string secondNumber = int.Parse(txtBoxSecond.Text);

        DoSomeMath(firstNumber, secondNumber);
    }

    // No relation to UI as it's parameter are independent of UI controls 
    private void DoSomeMath(string firstNumber, string secondNumber)
    {
        return firstNumber + secondNumber;
    } 

接下来,您可以将方法 DoSomeMath(string firstNumber, string secondNumber) 移动到不同的 Class/Library 以便它可以在不同的 Windows Forms/Web 页面/或其他 类.