简化一个典型的(?)条件结构

Simplify a typical(?) conditional construct

我经常看到(有时我自己也写过)这样的结构:

if(A || B)
{
    var sharedValue = ...;
    if(A)
    {
      // do stuff with sharedValue
    }
    else
    {
      // do other stuff with sharedValue 
    }
}

真实例子:

switch (e.Key)
{
   /* 
    * Don't mind the switch, since it can be simply converted into:
    * if(e.Key == Key.Left || e.Key == Key.Right) { ... }
    */
   case Key.Left: 
   case Key.Right:
       var container = containerFromData(data);
       if (e.Key == Key.Left)
       {
          this.TryNavigateBackward(container);
       }
       else
       {
          this.TryNavigateForward(container);
       }
}

我真的 觉得 好像我错过了什么,所以必须有更好的(更简单、更简洁)的方式来描述它,但无法想出一个主意。这个问题可能在某种程度上与一种编程语言有关(我目前使用的是 C#),但是是否有任何结构可以简化给定的示例?

注意: 我知道三元条件运算符 a ? b : c,但这(至少在 C# 中)仅在检索值并将它们放入变量时有效.上面的示例实际上想要 具有 shared 值的不同(可能复杂)的事情。

因为我没有看到任何其他建议,所以我会扔掉一些,看看它们是否是您要找的。

首先,如果 OOP 在 table 上,继承可以表示这种共享行为。您要做的是将共享的、A 特定的和 B 特定的行为封装在 classes SharedASpecificBSpecific 中,其中 ASpecificBSpecific 继承自 Shared。然后,如果 AB,则分别启动 ASpecificBSpecific 的实例,然后将其视为 Shared 的实例.如果你有条件 CD 等不使用共享的东西,你可能有另一个父 class 叫 Base 并且你有CBase, DBase 继承自 Base, Shared 继承自 Base, 并根据条件旋转一个实例并将结果视为 Base.

其次,当需要共享内容时,您可以通过将特定于 A 和特定于 B 的行为传递给共享方法来使用控制反转。您可以为此使用 OOP 或纯函数式编程。使用后者(因为前者与上述解决方案类似,可能不太好),您将有一个 shared 函数,该函数将函数 f 作为参数。函数 f 将有一个签名,要求传入共享对象。然后,如果 A,调用 shared 并使用函数(指针或匿名内联)执行 A-特定于传递给它的共享对象的东西;否则,如果 B,调用 shared 并使用一个函数对传递给它的共享对象执行 B 特定的操作。

如果你真正想要避免的只是嵌套,你也可以把 if (A || B) { … } 的东西拿出来,让它旋转起来 shared ,它在更高的范围内被声明但没有实例化;然后,稍后,分别检查 AB 并知道在这些情况下 shared 将具有之前所需的设置。