0

同じ操作を異なるオブジェクトに対して実行することになっている2つのボタンがあるとします。

現在、必要なすべての参照を次のようにメソッドに渡しています。

    private void sub1_add_to_db_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(
            substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn, sub1_found_in_db_list,
            sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
    }

    private void sub2_add_to_db_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(
            substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn, sub2_found_in_db_list,
            sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
    }

それを行うための他のより効率的な方法があるかどうか疑問に思っていました。ありがとう。

編集:

これは私のコードの一部がどのように見えるかであり、それは私を夢中にさせます!!!

private void sub1_add_to_db_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn,
            sub1_found_in_db_list, sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
    }

    private void sub2_add_to_db_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn,
            sub2_found_in_db_list, sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
    }

    private void sub1_edit_name_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn,
            sub1_found_in_db_list, sub2_found_in_db_list, true, sub1_listBox, sub2_listBox);
    }

    private void sub2_edit_name_btn_Click(object sender, EventArgs e)
    {
        Add_Substance_To_Database(substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn,
            sub2_found_in_db_list, sub1_found_in_db_list, true, sub2_listBox, sub1_listBox);
    }

    private void sub1_delete_from_db_btn_Click(object sender, EventArgs e)
    {
        Delete_Substance_From_DB(sub1_listBox,
            sub2_listBox,sub2_list_is_from_file,sub1_delete_from_db_btn,
            sub2_delete_from_db_btn);
    }

    private void sub2_delete_from_db_btn_Click(object sender, EventArgs e)
    {
        Delete_Substance_From_DB(sub2_listBox,
            sub1_listBox,sub1_list_is_from_file,sub2_delete_from_db_btn,
            sub1_delete_from_db_btn);
    }

例: 物質を削除したい場合は、両方のリストから削除し、他のリストからも削除する必要があります。選択を次の物質に変更するなど...

4

4 に答える 4

5

現在持っているものに異なる値を渡していることを考えると、Add_Substance_To_Databaseおそらく最も保守しやすいコードです。

両方のボタンに 1 つのイベント ハンドラーをアタッチすることもできますが、どちらのボタンが押されたかを調べて、関連する引数を渡す必要があります。

if (sender == button1)
{
    Add_Substance_To_Database(
        substanse1, sub1_add_to_db_btn, sub2_add_to_db_btn, sub1_found_in_db_list,
        sub2_found_in_db_list, false, sub1_listBox, sub2_listBox);
}
else
{
    Add_Substance_To_Database(
        substanse2, sub2_add_to_db_btn, sub1_add_to_db_btn, sub2_found_in_db_list,
        sub1_found_in_db_list, false, sub2_listBox, sub1_listBox);
}

それはあなたを正確にどこにも連れて行きません。

于 2012-06-30T23:20:48.153 に答える
3

これは、コードの重複の場合ではありません。そのようなケースをリファクタリングすると、次のようになります。

  • より複雑
  • 読めない

参照してください:コードが重複する正当な理由はありますか?

編集:

重複しているイベント ハンドラーに「肉」がこれ以上ある場合は、おそらく別のものをお勧めします。しかし、すべてを にプルしたAdd_Substance_To_Databaseので、コードの重複排除は既に成功しています。

于 2012-06-30T23:21:57.500 に答える
0

イベントハンドラーは、いくつかのコントロールの1つである可能性があります。送信側には、イベントを呼び出し、それをButtonクラスにキャストし、メソッドのパラメーターとしてthamを使用するボタンコントロールがあります。

varbutton =ボタンとしての送信者;

Add_Substance_To_Database(substanse2、button、sub1_add_to_db_btn、sub2_found_in_db_list、sub1_found_in_db_list、false、sub2_listBox、sub1_listBox);

他のパラメータについては、プロパティTagを使用できます。これは、開発者向けのオブジェクトです。

于 2012-06-30T23:30:08.537 に答える
0

最終的に私は自分の提案に従いました...すべてのコントローラーを含むオブジェクト配列を作成し、コントローラーのイベントハンドラーに同じメソッドを追加しました。この方法では、送信者に応じて適切なコントローラーを選択するだけです。

substance1_controllers = new object[]{
            sub1_main_listbox, sub1_peaks_list,sub1_found_in_db_list,
            sub1_similar_in_db_list, sub1_eigenvector_list,
            sub1_sourse_switch_btn, sub1_folder_btn,sub1_add_to_db_btn,
            sub1_edit_name_btn,sub1_delete_btn, sub1_picture_box,
            chart_peaks.Series[0], chart_compare.Series[0], true, -1};
substance2_controllers = new object[]{
            sub2_main_listbox, sub2_peaks_list, sub2_found_in_db_list,
            sub2_similar_in_db_list,sub2_eigenvector_list,
            sub2_sourse_switch_btn, sub2_folder_btn, sub2_add_to_db_btn,
            sub2_edit_name_btn,sub2_delete_btn, sub2_picture_box, 
            chart_peaks.Series[1],chart_compare.Series[1], true, -1};

そのように維持するのは難しいように見えるかもしれませんが、個人的には、このテーブルの助けを借りて維持および使用するのは非常に快適であることがわかりました (そして、それは素晴らしいです):

        // [0]  - Main Listbox
        // [1]  - Peaks Listbox
        // [2]  - Found in Database Listbox
        // [3]  - Found similar Listbox
        // [4]  - Eigenvectors Listbox
        // [5]  - Switch sourse Button
        // [6]  - Change Folder Button
        // [7]  - Add to Database Button
        // [8]  - Edit Name Button
        // [9]  - Delete Button
        // [10] - Picture Box
        // [11] - Peaks Chart Series
        // [12] - Compare Chart Series
        // [13] - List is from File Boolean
        // [14] - Previous Selected Index

メソッドの例:

void Delete_Substance_From_DB(object sender, EventArgs e)
    {
        object[] controller;
        object[] other_controller;
        if (((Button)sender).Name == "sub1_delete_btn")
        {
            controller = substance1_controllers;
            other_controller = substance2_controllers;
        }
        else
        {
            controller = substance2_controllers;
            other_controller = substance1_controllers;
        }
    }

使用例:

if (((ListBox)other_controller[0]).Items.Count != 0)
        {
            if (((ListBox)other_controller[0]).Items.Count == index2)
            {
                ((ListBox)other_controller[0]).SelectedIndex = index2 - 1;
            }
            else
            {
               ((ListBox)other_controller[0]).SelectedIndex = index2;
            }
            Main_Listbox_Index_Changed(((ListBox)other_controller[0]), null);
        }
于 2012-07-03T13:29:49.573 に答える