2

プロトタイプをしばらくハッキングした後、オブジェクトのブールフラグを更新してからインターフェイスを更新し、新しい値に基づいて処理を行うメソッドがいくつかありました。これらはほとんど同じですが、更新する値は異なります

たとえば、更新する色付きのボックスがたくさんあると想像してください。次のようなメソッドがあるかもしれません。

        protected void SetBlueBoxVisibility(bool blueBoxVisibility)
    {
        Project project = LoadProject();
        project.ShowBlueBox = blueBoxVisibility
        ReDrawSomeThings();
        CalcualteSomeStuff();
        Project.UpdateBoxStatus();
        SaveProject(project);
        ShowBlueBoxPanel(blueBoxVisibility);
        RaiseStatusUpdated();
    }

    protected void SetRedBoxVisibility(bool redBoxVisibility)
    {
        Project project = LoadProject();
        project.ShowRedBox = redBoxVisibility
        ReDrawSomeThings();
        CalcualteSomeStuff();
        Project.UpdateBoxStatus();
        SaveProject(project);
        ShowRedBoxPanel(redBoxVisibility);
        RaiseStatusUpdated();

    }       

さて、明らかに-そのほとんどが繰り返されます-これは私が何かを変えるようになると苦痛です。特に、2つではなく、20の異なるボックスの色になってしまった場合は!

変更されたコードを取り除き、より一般的な方法で同じものを収集する方法があるはずだと思っていましたが、それを行う方法を理解するのに苦労しています。

私は閉鎖について聞いたことがありますが、彼らがここで役立つかどうかを知るのに十分なほど頭を抱えていません。

次のことが正しい行にある可能性があると考えていましたが、ジェネリックメソッドにどのプロパティを操作するかを指示する方法がわかりません- [更新するプロジェクト変数]

        protected void SetRedBoxVisibility(bool redBoxVisibility)
    {
        SetGenericBoxVisibility([Project Variable To Update],redBoxVisibility)
        ShowRedBoxPanel(redBoxVisibility);
        RaiseStatusUpdated();   
    }

    protected void SetBlueBoxVisibility(bool blueBoxVisibility)
    {
        SetGenericBoxVisibility([Project Variable To Update],blueBoxVisibility)
        ShowBlueBoxPanel(blueBoxVisibility);
        RaiseStatusUpdated();   
    }

    protected void SetGenericBoxVisibility([Project Variable To Update], boxVisibility)
    {
        Project project = LoadProject();
        project.**[Project Variable To Update]** = boxVisibility
        ReDrawSomeThings();
        CalcualteSomeStuff();
        Project.UpdateBoxStatus();
        SaveProject(project);
    }

この種のものをどのように処理するかについてのポインタは役に立ちます:)

4

3 に答える 3

3

さて、次のように抽出できます。

protected void SetGenericBoxVisibility(Action<Project> propertySetter,
                                       Action<bool> panelShower,
                                       bool boxVisibility)
{
    Project project = LoadProject();
    propertySetter(project);
    ReDrawSomeThings();
    CalculateSomeStuff();
    Project.UpdateBoxStatus();
    SaveProject(project);
    panelShower();
    RaiseStatusUpdated();
}

それで:

protected void SetBlueBoxVisibility(bool blueBoxVisibility)
{
    SetGenericBoxVisibility(project => project.ShowBlueBox = blueBoxVisibility,
                            () => ShowBlueBoxPanel(blueBoxVisibility));
}

protected void SetRedBoxVisibility(bool redBoxVisibility)
{
    SetGenericBoxVisibility(project => project.ShowRedBox = redBoxVisibility,
                            () => ShowRedBoxPanel(redBoxVisibility));
}

確かに、それはひどくいいことではありません...

于 2011-09-07T15:53:23.533 に答える
1

これを本当にリファクタリングするには、IBox インターフェイスを作成する必要があると思います。基本的に、そのインターフェイスは、すべての Box オブジェクトが最低限持つ必要のあるメソッドとプロパティを定義するコントラクトとして機能します。

interface IBox {
 //your generic properties and method stubs
 Bool visibility;
}

次に、「ボックス」ごとにインターフェースを実装します

class blueBox : IBox
{
 //here you will have your concrete implementations of the above methods and properties
public Bool visibility   {get; set;} // this doesn't make sense with auto getter setters. you would need to write your bluebox specific getter and setters

}

class redBox : IBox
{
//more concrete implementation

}


public myMethod_To_Do_Stuff(IBox myBox) { // see how I am passing the interface not the conrete classes

myBox.visibility = true;

}
于 2011-09-07T15:56:35.127 に答える
1

もっと大きな問題があると思います-ボックスごとに1つの更新方法は単に適合しません。SetGenericBoxVisibility がありますが、Set*BoxVisibility メソッドを使い続けることで、適切な作業を元に戻すことができます。使用しているテクノロジーがわかりません。WPF で MVVM を調べている場合は、ViewModel を更新するだけです。WinForms の場合は、おそらくある種の辞書を作成する必要があります。Dictionary<BoxType, Box> _boxLookupここBoxTypeで、定義した型の列挙型を指定します。次に、ボックスの可視性を設定する_boxLookup[BoxType.Red].Property = value;には、ボックスを操作するメソッドにBoxTypeパラメーターを指定します。

ただし、そのソリューションでさえ理想的ではないため、さらにコンテキストがあれば非常に役立ちます。他のコードを移動したり、複数のボックスで解決しようとしている問題について全体像を把握したりすると、さらにいくつかの「あはは」の瞬間につながるはずです..

于 2011-09-07T15:50:16.907 に答える