2012-06-30 2 views
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); 
    } 

: 나는 물질을 삭제하려면 , 나는 ... 목록 모두에서 삭제하고 다른 목록에서 제거, 다음 물질 등으로 선택을 변경해야

+3

동일한 이벤트 처리기를 여러 단추까지 연결 한 다음 보낸 사람을 기준으로 실행할 Add_Substance_To_Database 변형을 선택할 수 있습니다. 그러나 실제로 substance1과 기타 변수 인수는 드롭 다운 목록과 같은 컨트롤에서 가져온 것처럼 UI를 변경하는 것이 좋습니다. 표시 할 수있는 GUI 샘플이 있습니까? – dash

+0

개인 정보 보호를 위해 GUI를 게시하지 않는 것이 좋습니다. 그 이유는 편의상, 필자는 나란히 비교 된 2 가지 물질 목록을 가져야 만한다는 것입니다. 하나의 목록에서 하나의 물질을 각각 선택하면 다른 목록의 다른 선택된 물질과 관련된 비교 작업이 수행됩니다. 또한 각 목록 옆에는 삭제, 편집, 데이터베이스에 추가 등의 단추가 있습니다 ... 각 단추에는 위에서 쓴 것과 같은 방법이 있습니다. – Igor

+0

왜 버튼과 목록 상자를 함수에 전달합니까? substance1 목록과 substance2 목록에 무엇이 있는지보고 싶어하는 것으로 이해할 수있는 목록 상자. 엄밀히 말하면 사용자가 각 목록에서 하나씩 두 개의 항목을 선택하도록 허용하면 선택한 항목과 목록을 메서드에 전달할 수 있습니다. 예를 들어 Add_Substance_To_Database 내의 해당 항목에 대한 각 목록을 검색 할 수 있습니다. – dash

답변

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; 
     } 
    } 

사용 examle :

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); 
     } 
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); 
} 

합니다.

+0

+1 동의; 이것은 GUI 로의 변경으로 GUI 저장을 대폭 간소화 할 수있는 상황처럼 느껴졌습니다. – dash

+0

모든 컨트롤을 객체 배열에 저장 한 다음 함수에 전달하는 것이 더 효율적이라고 생각했습니다 (코더 관점에서 볼 때). like : if (sender == button1) Add_Substance_To_Database (array1) .. else array2 .. 그런 다음 각 메서드는 캐스팅하여 관련 컨트롤 만 "추출"할까요? – Igor

3

이것은 코드 복제의 경우가 아닙니다. 이러한 경우 리팩토링 만 그것을 만들 것입니다 :

  • 더 복잡
  • 읽을 수

참조하십시오 Any valid reason for code duplication?

편집 :

당신이 경우에 더 이상 '고기'를 가지고 있다면 복제 된 핸들러는 아마도 다른 것을 제안 할 것입니다. 그러나 당신은 Add_Substance_To_Database에 모든 것을 가져 와서 이미 코드를 성공적으로 중복 제거했습니다.

+0

편집 된 게시물을보고 ... 내가 그렇게 남겨 두어야한다고 생각하니? 첫 번째 대답의 코멘트에서 내가 제안한 것에 대해 어떻게 생각하십니까? – Igor

+0

나는 내 위치에 머물러있을 것이고, 너에게 물어볼 것이다. 너를 미치게 만들지 않는 코드의 모습은 무엇인가? 왜 미쳤 니? 미학적으로 만족스럽지 않거나 유지하기가 어렵다는 것을 알았습니까? 아니면 디버그하기가 어려울 것이라고 생각합니까? 이러한 경우를 리펙토링 (어떤 경우에는 매개 변수 목록을 유지하는 데 적합 할 것입니다)하는 것이 필요합니다. –

0

이벤트 핸들러는 보낸 사람에 당신이 버튼 컨트롤, 호출 이벤트를 버튼으로 버튼을

VAR 방법의 parametrs로 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); 당신은 속성 태그를 사용할 수있는 다른 매개 변수에 대한

는, 내가 모든 컨트롤러 객체 배열을 생성하고, 컨트롤러 이벤트 핸들러에 동일한 방법을 추가 ... 결국 나는 내 자신의 제안을 따라

관련 문제