C# 重构启用/禁用按钮切换函数

C# 重构启用/禁用按钮切换函数,c#,refactoring,C#,Refactoring,我有以下简单的功能: private void EnableDisable941ScheduleBButton() { if (this._uosDepositorFrequency.Value != null) this._btnScheduleB.Enabled = ((int)this._uosDepositorFrequency.Value == 0); } 它是Winform类的一个成员,我正试图将其拆分为被动视图和演示

我有以下简单的功能:

    private void EnableDisable941ScheduleBButton()
    {
        if (this._uosDepositorFrequency.Value != null)
            this._btnScheduleB.Enabled = ((int)this._uosDepositorFrequency.Value == 0);
    }
它是Winform类的一个成员,我正试图将其拆分为被动视图和演示者。很明显,业务逻辑与UI连接纠结在一起。我只是不知道最好的办法来分开他们

为了提供一点上下文,从表单中的三个位置调用函数_uosDepositorFrequency是一个只有两个按钮的radiobutton组

有什么想法吗

更新:


好吧,也许没有我想的那么明显。业务规则规定,如果雇主每半周存款一次(_uosdepositorforfrequency.Value=0),他们必须填写附表B表格。

我认为这不是业务逻辑。在我看来,它像是UI逻辑。我不会改变它


虽然如果我使用wpf,我会将启用状态绑定到数据。

也许我遗漏了什么,但我不确定我是否看到了那里的业务逻辑。您只是根据窗体上的另一个控件是否有值来启用/禁用按钮。我不认为有必要重构这个方法,对我来说,这都是视图逻辑。

听起来你把UI逻辑和业务规则混为一谈了。您拥有的代码是UI逻辑,不应该重构。您所说的业务规则是,如果
\u btnScheduleB
的值为
0
,则需要用户填写表单。您的业务逻辑应该是确保在用户可以继续之前启用
\u btnScheduleB
时,您已经填写了表单。

演示者:

    if(this._uosDepositorFrequency.Value > 0) //int objects cannot be null
         ViewData["ScheduleBRequired"] = true;
视图:

如果这是一项业务需求,需要填写,则应由演示者触发。 用户界面负责遵循演示者的决定。e、 g.是否需要ScheduleB…

另一种选择(我并不是说它是更好的选择)是让无线电控制的选择更改事件更新模型(雇主实体?),这反过来会触发UI订阅的某种寄存更改事件,并相应地启用/禁用schedule按钮。观察者模式,或多或少

也就是说,上述替代方案会产生更多的复杂性,我建议将其留给UI代码(添加一条注释或使用中间布尔变量向读者陈述意图)。特别是如果这是唯一使用规则的地方


关于代码的旁注:在类字段前面加下划线还是使用
this.
这是一场宗教辩论。我想每个人都同意使用两者是多余的…

正如其他人指出的那样,这是为了保持用户界面的一致性,因此实际上不是业务逻辑。您可以像这样删除空检查

this._btnScheduleB.Enabled = (int)(this._uosDepositorFrequency.Value ?? 0) == 0;

我不会太担心重构两行代码,除非它在当前的格式中真的没有意义。

首先我要感谢所有回答我问题的人

我花了一些时间在这方面,我相信我已经找到了一个解决办法

首先,我公开了_uosDepositorFrequency.Value和_btnScheduleB.Enabled作为公共属性,并更新了视图界面。我还花了一些时间为存款频率定义了一个枚举

    public bool EnableScheduleB
    {
        get
        {
            return _btnScheduleB.Enabled;
        }
        set
        {
            _btnScheduleB.Enabled = value;
        }
    }

    public DepositFrequency DepositorFrequency
    {
        get
        {
            return (DepositFrequency)_uosDepositorFrequency.Value;
        }
        set
        {
            _uosDepositorFrequency.Value = (int)value;
        }
    }
然后,我将原始函数的主体复制到我的演示者,并修改它以使用我刚才创建的属性。原来没有必要在原始函数中进行null检查,因为_uosDepositorFrequency控件已在其他地方初始化

    public void UpdateScheduleBStatus()
    {
        ReturnView.EnableScheduleB = ReturnView.DepositorFrequency == DepositFrequency.Semiweekly;
    }
最后,更新了_uosDepositorFrequency_ValueChanged事件处理程序,以调用UpdateScheduleBStatus

    private void _uosDepositorFrequency_ValueChanged(object sender, System.EventArgs e)
    {
        Presenter.UpdateScheduleBStatus();
    }

欢迎评论。

您真的需要将所有业务规则移出UI层吗?这通常会增加复杂性,有时值得使用一些分散的逻辑(特别是您展示的那种逻辑…)好吧,我之所以将业务规则分离出来,是因为表单将被替换,但规则仍然保留。这很公平。我在下面的答案中给了你一个选择。然而,就我个人而言,我会保持原样,只为替换者评论;一般来说,只有当您在多个UI之间共享业务规则时,它才有意义……当UI频繁更改时,它也会派上用场。防止更改干扰业务逻辑。是的,我知道。该项目由另一家公司所有,我认为该团队无法就编码标准达成一致。当我找到它时,我一直在清理它。@Dave:代码不是100%等同于原始代码。如果该值为null,则原始代码不会更改按钮的启用状态(而您的代码会更改)。然而,它可能会起作用,因为海报更了解上下文。
    private void _uosDepositorFrequency_ValueChanged(object sender, System.EventArgs e)
    {
        Presenter.UpdateScheduleBStatus();
    }