这是实现布尔逻辑的更简洁的方式,如果发生两种情况中的任何一种就会通过

本文关键字:任何一 情况 两种 如果 布尔逻 实现 简洁 方式 | 更新日期: 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工具包,可能不可能,或者比设置布尔值更有利)。

相关文章: