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

    }       

现在,很明显——大部分内容都是重复的——当我开始改变任何事情时,这很痛苦。特别是如果我最终得到二十种不同的盒子颜色,而不仅仅是两种!

我在想必须有一种方法可以去除更改的代码并以更通用的方法收集相同的东西 - 但我很难弄清楚如何做到这一点。

我听说过关闭 - 但我对它们的了解还不够,不知道它们是否会在这里提供帮助。

我在想可能以下内容可能在正确的行上-但我不知道如何告诉泛型方法要对哪个属性进行操作- [要更新的项目变量]

        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

我认为您可能有更大的问题 - 每个盒子的一种更新方法根本不适合。您拥有 SetGenericBoxVisibility 但随后通过继续拥有 Set*BoxVisibility 方法撤消任何好的工作。我不知道您使用的是哪种技术 - 如果它是 WPF 查看 MVVM,那么您可以简单地更新您的 ViewModel。如果是 WinForms,您也许应该创建某种字典 -您定义的类型的枚举在Dictionary<BoxType, Box> _boxLookup哪里。BoxType然后要设置框的可见性,您可以这样做,或者您可以使用带有参数_boxLookup[BoxType.Red].Property = value;的框来操作框的方法。BoxType

但是,更多的上下文将非常有用,因为即使该解决方案也不理想。移动一些其他代码或深入了解您正在使用多个框解决的问题的更大图景应该会导致更多的“啊哈”时刻..

于 2011-09-07T15:50:16.907 回答
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 回答