这是实现布尔逻辑的更简洁的方式,如果发生两种情况中的任何一种就会通过
本文关键字:任何一 情况 两种 如果 布尔逻 实现 简洁 方式 | 更新日期: 2023-09-27 18:05:33
这种情况每隔一段时间就会发生在我身上,我总是以同样的方式解决它,然后希望有一个更干净的方法。
我从调用相关的实用程序函数开始,然后是更新调用。
SynchA();
SynchB();
UpdateLastTime();
然后我添加了复选框,所以我有:
if(synchA.Checked)
{
SynchA();
}
if(synchB.Checked)
{
SynchB();
}
但是现在我只想调用UpdateLastTime()的一个或两个执行,所以总是我结束与:
bool synchHappened = false;
if(synchA.Checked)
{
SynchA();
synchHappened = true;
}
if(synchB.Checked)
{
SynchB();
synchHappened = true;
}
if(synchHappened)
{
UpdateLastTime();
}
最后一步总是困扰着我,因为我要把这一步扩展到三个逻辑分支。
对于上述逻辑/场景,我是否可以使用一些明显更好的方法?
主要目标是- 每次逻辑发生变化时-代码至少应该受到影响。所以你只需要构造一次这样的东西,然后它就会为你工作。
在你的特殊情况下,我建议保持简单(没有策略模式等),所以提取并封装开关逻辑到属性中。所以每次需求都会改变-你必须更新特定开关的逻辑或主逻辑本身。
带有封装规则的交换机:
bool IsUpdateLastTime
{
get
{
// logic here even can be fully or partially injected
// as Func<bool>
return this.IsSyncA || this.IsSyncB;
}
}
bool IsSyncA { get { return synchA.Checked; } }
bool IsSyncB { get { return synchB.Checked; } }
主要逻辑:if (this.IsUpdateLastTime)
{
this.UpdateLastTime();
}
这类问题正是Rx真正有用的地方,因为您可以将多个事件合并为一个事件。可以这样做。
(本例假设为winforms,但与WPF等类似,只需更改事件名称/FromEvent的泛型类型参数)
var synchAchecked = Observable.FromEvent<EventArgs>(synchA.CheckedChanged);
var synchBchecked = Observable.FromEvent<EventArgs>(synchB.CheckedChanged);
var merged = Observable.Merge(synchAchecked, synchBchecked);
synchAchecked.Subscribe(x => SynchA());
synchBchecked.Subscribe(x => SynchB());
merged.Subscribe(x => UpdateLastTime());
尽管它仍然需要单独的变量,但人们可能会认为这种模式更紧凑(并且可能更具可读性)。
bool syncHappened = false;
if(syncHappened |= synchA.Checked) SynchA();
if(syncHappened |= synchB.Checked) SynchB();
if(syncHappened) UpdateLastTime();
有些人可能不喜欢这个,但我觉得它非常有用和干净。这有点奇怪,所以使用它取决于你的决定。
UpdateLastTime(Either(SynchA(synchA.Checked), SynchB(synchB.Checked)));
private bool Either(bool first, bool second)
{
return first || second;
}
这要求将SynchA()
, SynchB()
和UpdateLastTime()
修改为在shouldRun为false时不工作,并根据是否发生同步返回true或false。
有点以C为中心,但是:
if (checked_syncs & SYNC_A)
SyncA();
if (checked_syncs & SYNC_B)
SyncB();
if (checked_syncs)
UpdateLastTime();
这样做的好处是不需要更改最后一次检查(除非您用完了位,在这种情况下,您可以切换到更大的基本类型,或者使用多个基本类型)。它还具有有效地并行处理UpdateLastTime()的所有or的优点,因此它也是一个快速的解决方案。
注意:当然SYNC_A和SYNC_B必须是唯一的2的幂,是的-这可能会稍微破坏您的封装,并且假设您可以在检查发生时|=条件(如果您正在谈论特定的GUI工具包,可能不可能,或者比设置布尔值更有利)。