2012-06-06 3 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_. Прочитайте два метода _carefully_. '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

каждого человека о не выходя за бортом за счет создания коды менее читаемого

Единственная мысль, у меня есть ...

От всего кода отвечала, но это выглядит как selectedLabsData и availableLabsData плотно переплетены, поэтому я не ставил бы логику, связанную с ними в обработчиках событий. Поместите логику в разные методы (желательно другой класс), чтобы вы никогда не обновляли их без обновления другого. Это дает возможность сделать эти методы более простыми и более «читаемыми».

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

Еще лучше, если вы могли бы использовать лямбда-выражения, чтобы сделать код еще более лаконичным:

btnAdd.Clicked += (sender, e) => LabsDataAdded(bindingSource1.Current as LabEntity); 
btnAdd.Clicked += (sender, e) => LabsDataRemoved(bindingSource1.Current as LabEntity); 
Смежные вопросы