2

以下の方法は、互いに逆になっています。ロジックを1つのメソッドに組み合わせることができると思います。私はリフレクションを避けたいです。それらを組み合わせて読みやすさを維持することは可能ですか?

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

7 に答える 7

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

これが読みやすさに役立つかどうかはわかりませんが、コードの重複が減ります。

于 2012-06-06T18:29:26.603 に答える
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);
}
于 2012-06-06T18:31:22.247 に答える
1

コードの可読性を大幅に低下させない 2 つのメソッドをリファクタリングする方法はありません。これは、投稿された他の回答のいくつかで確認できます。これは、読みやすさのためにコードの重複のレベルが許容される場合です。

于 2012-06-06T18:32:53.840 に答える
0

両方のボタンを 1 つのイベント ハンドラーにリンクします。ハンドラーは次のようになります: ('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);
        }
    }
于 2012-06-06T18:31:48.253 に答える
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
}
}

これはコンパイルエラーをチェックしていません。これは単なる例です。

于 2012-06-06T18:29:10.923 に答える
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);
于 2012-06-06T19:00:29.377 に答える
-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);
}
于 2012-06-06T18:23:51.257 に答える