関数へのグローバル変数とパラメーターの使用

Sameer

勝利フォームのベストプラクティスに関するアドバイスが必要です。

関数でグローバル変数を使用するか、その変数をパラメーターとして関数に渡す方がよいかどうかを知りたいです。したがって、このグローバル変数は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]

編集
0

コメントを追加

0

関連記事

分類Dev

関数パラメータを使用する理由と グローバル変数?

分類Dev

関数グローバル/ローカル変数の問題への入力パラメーターとして辞書を渡す

分類Dev

パラメータJavascriptを使用した関数を使用したグローバル変数の変更

分類Dev

関数のパラメーターとしてグローバル変数を操作する

分類Dev

パラメータを使用して関数内のグローバル変数を変更する方法

分類Dev

ラッパー関数でのsetjmpの使用とローカル変数のクロバリング

分類Dev

Groovy Closureの変数スコープ(グローバル変数と関数パラメーターは同じ名前です)

分類Dev

関数C ++へのパラメーターとして変数パラメーターを持つ関数

分類Dev

C ++-関数ヘッダーのローカル変数へのパラメーターの割り当て

分類Dev

複数のパラメーターのグローバル平均

分類Dev

グローバル変数としての角度とパラメーターの違いは?

分類Dev

クラス変数の使用と関数/メソッドへのローカル変数の送信

分類Dev

クラス変数(メンバー変数)とローカル変数(グローバル変数)の違い

分類Dev

Kotlin関数のオーバーロード(可変引数と単一パラメーター)

分類Dev

関数パラメーターを使用してグローバル変数を作成できますか?

分類Dev

グローバル変数ではなく実際のパラメーターとして配列を関数に渡す方法

分類Dev

別の関数へのパラメーターとして変数引数を持つ関数

分類Dev

関数パラメータをグローバル変数として設定する

分類Dev

Javascript:1。グローバル変数をパラメーターとして受け入れる2.そのグローバル変数の値を変更する関数を作成するにはどうすればよいですか?

分類Dev

Angularjs $ interval:パスイン関数へのパラメーターとしてコールバック関数を使用する

分類Dev

Pythonの関数パラメーターとしての変数

分類Dev

関数外の関数で作成されたパラメーターと変数へのアクセス(Python)

分類Dev

関数パラメーターへのF#タプル

分類Dev

関数パラメーターと関数パラメーターへのポインター?

分類Dev

パラメータなしの再帰、静的変数またはグローバル変数

分類Dev

グローバル変数jqueryへのAPIデータの保存

分類Dev

イベントハンドラー関数のグローバル変数とローカル変数

分類Dev

Python:関数パラメーターから取得するグローバル変数を変更します

分類Dev

javascriptグローバル/ローカル変数とHTMLへの戻り変数

Related 関連記事

  1. 1

    関数パラメータを使用する理由と グローバル変数?

  2. 2

    関数グローバル/ローカル変数の問題への入力パラメーターとして辞書を渡す

  3. 3

    パラメータJavascriptを使用した関数を使用したグローバル変数の変更

  4. 4

    関数のパラメーターとしてグローバル変数を操作する

  5. 5

    パラメータを使用して関数内のグローバル変数を変更する方法

  6. 6

    ラッパー関数でのsetjmpの使用とローカル変数のクロバリング

  7. 7

    Groovy Closureの変数スコープ(グローバル変数と関数パラメーターは同じ名前です)

  8. 8

    関数C ++へのパラメーターとして変数パラメーターを持つ関数

  9. 9

    C ++-関数ヘッダーのローカル変数へのパラメーターの割り当て

  10. 10

    複数のパラメーターのグローバル平均

  11. 11

    グローバル変数としての角度とパラメーターの違いは?

  12. 12

    クラス変数の使用と関数/メソッドへのローカル変数の送信

  13. 13

    クラス変数(メンバー変数)とローカル変数(グローバル変数)の違い

  14. 14

    Kotlin関数のオーバーロード(可変引数と単一パラメーター)

  15. 15

    関数パラメーターを使用してグローバル変数を作成できますか?

  16. 16

    グローバル変数ではなく実際のパラメーターとして配列を関数に渡す方法

  17. 17

    別の関数へのパラメーターとして変数引数を持つ関数

  18. 18

    関数パラメータをグローバル変数として設定する

  19. 19

    Javascript:1。グローバル変数をパラメーターとして受け入れる2.そのグローバル変数の値を変更する関数を作成するにはどうすればよいですか?

  20. 20

    Angularjs $ interval:パスイン関数へのパラメーターとしてコールバック関数を使用する

  21. 21

    Pythonの関数パラメーターとしての変数

  22. 22

    関数外の関数で作成されたパラメーターと変数へのアクセス(Python)

  23. 23

    関数パラメーターへのF#タプル

  24. 24

    関数パラメーターと関数パラメーターへのポインター?

  25. 25

    パラメータなしの再帰、静的変数またはグローバル変数

  26. 26

    グローバル変数jqueryへのAPIデータの保存

  27. 27

    イベントハンドラー関数のグローバル変数とローカル変数

  28. 28

    Python:関数パラメーターから取得するグローバル変数を変更します

  29. 29

    javascriptグローバル/ローカル変数とHTMLへの戻り変数

ホットタグ

アーカイブ