2012-06-06 116 views
2

下面的方法是相互顛倒的。我懷疑我可以將邏輯合併成一種方法。我寧願避免反思。是否可以合併它們並保持可讀性?如何將這兩種類似的方法合併爲一個?

private void btnAdd_Click(object sender, EventArgs e) 
    { 
     LabEntity selectedItem = bindingSource1.Current as LabEntity; 
     selectedLabsData.Add(selectedItem); 
     availableLabsData.Remove(selectedItem); 
    } 

    private void btnRemove_Click(object sender, EventArgs e) 
    { 
     LabEntity selectedItem = bindingSource2.Current as LabEntity;//new binding source 
     availableLabsData.Add(selectedItem);//called Add instead of remove 
     selectedLabsData.Remove(selectedItem);//called Remove instead of Add 
    } 
+7

我怎麼沒看到你可以做更多的事情。在不同的項目上操作,並與他們做不同的事情。進一步抽象會降低代碼的可讀性和可理解性。 – Oded

+2

將兩種方法合併爲一種方法會使複雜性更大。我認爲目前的實施看起來可讀。 –

+1

不要過度工程它 - 這是非常簡單的閱讀和維護 – jglouie

回答

13

你可以分解出的邏輯變成一個輔助方法:

private void ListFixup(object entity, List<Item> addList, List<Item> removeList) 
{ 
    LabEntity selectedItem = entity as LabEntity; 
    // don't forget your error checking here 

    addList.Add(selectedItem); 
    removeList.Remove(selectedItem); 
} 

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    ListFixup(bindingSource1.Current, selectedLabsData, availableLabsData); 
} 

private void btnRemove_Click(object sender, EventArgs e) 
{ 
    ListFixup(bindingSource2.Current, availableLabsData, selectedLabsData); 
} 

我不知道這會有所幫助的可讀性,但它確實減少代碼的重複。

+1

第一個正確答案...並且我同意這不會有助於可讀性。 – Oded

+0

我也需要添加一些空檢查邏輯。所以我想看看是否有某種方式可以用可讀的方式將它們結合起來。 –

-2

事情是這樣的:

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    LabEntity selectedItem = bindingSource1.Current as LabEntity; 
    RemoveItemFromList(selectedItem); 
} 

private void btnRemove_Click(object sender, EventArgs e) 
{ 
    LabEntity selectedItem = bindingSource2.Current as LabEntity;//new binding source 
    RemoveItemFromList(selectedItem); 
} 

private void RemoveItemFromList(LabEntity ent) 
{ 
    selectedLabsData.Add(ent); 
    availableLabsData.Remove(ent); 
} 
+2

不是。 OP正在從_different_列表中添加和刪除。 – Oded

+0

在你的例子中有兩個不同的源,你在同樣的兩個列表上創建相同的操作? –

+1

OP _isn't_執行_same_操作。請仔細閱讀這兩種方法。 'selectedLabsData.Add!= availableLabsData.Add' – Oded

0

添加一個標籤給發件人?

private void btnClick(object sender, EventArgs e) 
{ 
Button *myButton = (Button)sender; 
if (myButton.tag == 1){ 
     LabEntity selectedItem = bindingSource1.Current as LabEntity; 
     selectedLabsData.Add(selectedItem); 
     availableLabsData.Remove(selectedItem); 
} 
else { 
LabEntity selectedItem = bindingSource2.Current as LabEntity;//new binding source 
     availableLabsData.Add(selectedItem);//called Add instead of remove 
     selectedLabsData.Remove(selectedItem);//called Remove instead of Add 
} 
} 

我沒有檢查這個編譯器錯誤,這只是一個例子。

1
private void btnAdd_Click(object sender, EventArgs e) 
{ 
    SwapThem(bindingSource1, selectedLabsData, availableLabsData); 
} 

private void btnRemove_Click(object sender, EventArgs e) 
{ 
    SwapThem(bindingSource2, availableLabsData, selectedLabsData); 
} 

// I just don't know the proper type-cast of the "toAddTo" and "toRemoveFrom" parameters. 
private void SwapThem(BindingSource bs, List<yourType> toAddTo, List<yourType> toRemoveFrom) 
{ 
    LabEntity selectedItem = bs.Current as LabEntity; 
    toAddTo.Add(selectedItem); 
    toRemoveFrom.Remove(selectedItem); 
} 
0

將兩個按鈕鏈接到單個事件處理程序。然後,處理程序可能看起來是這樣的:(原諒按鈕上的多張支票,因爲我不知道什麼類型爲「availableLabsData」和「selectedLabsData」作爲申報人):

private void btnClick(object sender, EventArgs e) 
    { 
     var bindingSource = (sender == btnRemove) ? bindingSource2 : bindingSource1; 
     var selectedItem = source.Current as LabEntity; 
     if(sender == btnRemove) 
     { 
      availableLabsData.Add(selectedItem); 
      selectedLabsData.Remove(selectedItem); 
     } 
     else if(sender == btnAdd) 
     { 
      availableLabsData.Remove(selectedItem); 
      selectedLabsData.Add(selectedItem); 
     } 
    } 
1

沒有任何重構這兩種方法的方法都不會顯着降低代碼的可讀性,您可以在發佈的其他答案中看到這一點。爲了便於閱讀,這種情況下代碼複製的級別是可以接受的。

0

大家關於在使代碼的可讀性爲代價不會過分右

唯一的想法我是...

從剛纔的代碼發佈,但它看起來像selectedLabsDataavailableLabsData緊密地交織在一起,所以我不會將與他們有關的邏輯放在事件處理程序中。將邏輯放在不同的方法中(最好是不同的類),以便在不更新其他方法的情況下不會意外更新它。這有利於使所討論的方法更簡單和更「可讀」。

private void LabsDataAdded(LabEntity value) 
{ 
    selectedLabsData.Add(value); 
    availableLabsData.Remove(value); 
} 

private void LabsDataRemoved(LabEntity value) 
{ 
    availableLabsData.Add(value); 
    selectedLabsData.Remove(value); 
} 

那麼方法也只是:

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    LabsDataAdded(bindingSource1.Current as LabEntity); 
} 

private void btnRemove_Click(object sender, EventArgs e) 
{ 
    LabsDataRemoved(bindingSource2.Current as LabEntity); 
} 

更妙的是,你可以使用lambda表達式做得更簡潔的代碼:

btnAdd.Clicked += (sender, e) => LabsDataAdded(bindingSource1.Current as LabEntity); 
btnAdd.Clicked += (sender, e) => LabsDataRemoved(bindingSource1.Current as LabEntity); 
相關問題