我需要一些有关获胜表格最佳实践的建议。
我想知道什么更好-在函数中使用全局变量或将该变量作为参数传递给函数。 因此,此全局变量在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)
?。
任何帮助都会很棒。谢谢。
答案 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逻辑与域逻辑分开。