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