对函数使用全局变量vs参数

时间:2018-08-21 21:30:26

标签: c# .net winforms

我需要一些有关获胜表格最佳实践的建议。

我想知道什么更好-在函数中使用全局变量或将该变量作为参数传递给函数。 因此,此全局变量在FormLoad()中分配了某些内容,然后在函数中使用。可以在函数中修改此全局变量。

请查看下面的代码:

public partial class Form1 : Form
{
    private List<Employee> _employees;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Fill _employees Here
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Func1();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Func2(_employees);
    }

    private void Func1()
    {
        //Code uses _employees
    }

    private void Func2(List<Employee> employees)
    {
        //Code uses employees
    }    

    public class Employee
    {
       //Something 
    }
}

您认为哪个更好? Func1()还是Func2(parameter)?。

任何帮助都会很棒。谢谢。

2 个答案:

答案 0 :(得分:2)

通常情况下,我会将两个版本的保留为重载的方法

// if no data provided, use default - _employees
private void Func()
{
    Func(_employees);
}

// In case of explicit data provided - use it
//TODO: set employees type being as general as you can; 
// at least IList<Employee> or even IEnumerable<Employee> if it's possible
private void Func(IList<Employee> employees)
{
    ...
}  

答案 1 :(得分:1)

临时数据应为本地数据。

class EmployeeHelper
{
    public Employee FindEmployee(string id)
    {
        List<Employee> temporaryList = GetEmployees();  //Use then throw away
        return temporaryList.Single( e => e.Id == id );
    }
}

与类一起保留的数据应该是成员变量。

class Employees
{
    private List<Employee> _list;  //Keep around as long as the object exists
}

通常,better是函数将其所有依赖项作为参数来接收,而不是从更高范围的变量中读取它们:

string BadFunction()
{
    return Globals.A + " " + Globals.B;  //Accessing global variables is confusing
}

string GoodFunction(string a, string b)
{
    return a + " " + b;  //Clear, and also idempotent
}

但是,如果类代表包含逻辑思想状态的内聚变量的集合,则可以取消此规则:

class Customer
{
    public string FirstName { get; set ; }        
    public string LastName { get; set ; }

    public string GetFullName()
    {
        return FirstName + " " + LastName;   //Would be silly to pass in the first and last names here
    }
}

现在,在您的情况下,您有一个在WinForms中非常常见的混合对象...一个类,该类表示对某个对象(在这种情况下为雇员列表)的 view 形式。这些数据是否应该传递或作为成员变量进行访问变得模棱两可。我只能提供以下经验法则:

如果该变量表示一个与代码绑定的列表,请全局访问它。例如,如果该方法的目的是更新绑定到该数据项的控件,并且数据项必须在该列表中,则以成员变量的形式访问该变量:

class Form1 : Form
{
    List<Employee> _list;  

    public Form1()
    {
        _list = GetEmployees();
        this.MyList.DataSource = _list;
    }

    void ShowEmployeeName(string id)
    {
        var e = _list.Single( e => e.Id == id );
        this.NameLabel.Text = e.Name;
    }
}

如果是更一般的用途,则将列表传递进去,因为您可能希望有一天能够传递不同的列表:

class Form1 : Form
{
    List<Employee> _list;  

    string GetEmployeeName(List<Employee> list, string id)
    {
        var e = list.Single( e => e.Id == id );
        return e.Name;
    }
}

当然,最面向对象的方法是使方法成为类的成员,而不是表单的成员:

class EmployeeList : List<Employee>
{
    public Func1() {  DoSomething(); }
}

class Form1 : Form
{
    protected EmployeeList _list;

    public void button1_click(object sender, EventArgs e)
    {
        _list.Func1();
    }
}   

最后一个选项可能是最佳实践,因为它将UI逻辑与域逻辑分开。