简化典型的(?)条件构造

时间:2018-10-23 08:47:29

标签: logic boolean-logic

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

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 值的不同(也许是复杂的)事情。

1 个答案:

答案 0 :(得分:1)

由于我没有看到其他建议,因此我将一些建议排除在外,看看它们是否正是您要的。

首先,如果表上有OOP,则继承可以表示这种共享行为。您要做的是封装ABShared类中ASpecificBSpecific共享的行为,其中{{1} }和ASpecific继承自BSpecific。然后,如果是SharedA,则分别旋转BASpecific的实例,然后将其视为BSpecific的实例。 。如果您有不使用共享事物的条件SharedC等,则可能有另一个名为D的父类,并且您有{{1} },Base继承自CBaseDBase继承自Base,并根据条件旋转一个实例,并将结果视为Shared的实例

第二,当需要共享内容时,可以通过将A特定行为和B特定行为传递给共享方法来使用控制反转。您可以将OOP用于此编程或纯函数式编程。与后者配合使用(因为前者与上述解决方案相似,并且可能不太理想),因此您将拥有一个Base函数,该函数将函数Base作为参数。函数shared的签名要求传递共享对象。然后,如果f,请使用执行{{1的函数(指针或匿名内联)调用f }}特定的东西传递给共享对象;否则,如果是A,请使用对传递到其中的共享对象执行shared特定内容的函数来调用A

如果您真正想避免的是嵌套,则还可以将B内容带出并使其旋转共享,这是已声明但未在更高范围中实例化的;然后,以后再分别检查sharedB并知道在这些情况下if (A || B) { … }将具有较早版本所需的设置。