勝利フォームのベストプラクティスに関するアドバイスが必要です。
関数でグローバル変数を使用するか、その変数をパラメーターとして関数に渡す方がよいかどうかを知りたいです。したがって、このグローバル変数は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)
?
どんな助けでも素晴らしいでしょう。ありがとう。
一時的なデータはローカルである必要があります。
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
}
一般に、関数は、スコープの高い変数からそれらを読み取るよりも、すべての依存関係をパラメーターとして受け取る方が適切です。
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で非常に一般的なハイブリッドがあります...あるオブジェクト、この場合は従業員のリストへのビューであるフォームを表すクラスです。これにより、これらのデータをメンバー変数として渡すか、アクセスするかがあいまいになります。私はこれらの経験則のみを提供することができます:
変数がコードにハードカバーされているリストを表す場合は、グローバルにアクセスします。たとえば、メソッドの目的がそのデータアイテムにバインドされているコントロールを更新することであり、データアイテムがそのリストに含まれている必要がある場合は、メンバー変数として変数にアクセスします。
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ロジックをドメインロジックから分離するため、おそらくベストプラクティスです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加