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您现在拥有的可能是您所希望的最可维护的代码。

您可以将一个事件处理程序附加到两个按钮,但您必须确定按下了哪个按钮并传递相关参数:

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

事件处理程序可能是少数控件之一,在发送者中您有按钮控件,它调用事件,将其转换为 Button 类并使用 tham 作为方法的参数

var button = 作为按钮的发送者;

Add_Substance_To_Database(substanse2,按钮,sub1_add_to_db_btn,sub2_found_in_db_list,sub1_found_in_db_list,假,sub2_listBox,sub1_listBox);

对于其他参数,您可以使用属性标签,它是开发人员目的的对象

于 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 回答