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



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

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# 中(仅在检索值并将其放入变量时有效。上面的例子想要用一个共享的值实际不同(也许是复杂的(事情。

由于我没有看到任何其他建议,我将抛出一些建议,看看它们是否是您要查找的。

首先,如果 OOP 在表上,继承可以表示这种共享行为。你要做的是将共享的、特定于A和特定于B的行为封装在类SharedASpecificBSpecific中,其中ASpecificBSpecific继承自Shared。然后,如果AB,则分别启动ASpecificBSpecific的实例,然后将其视为Shared的实例。如果你有不使用共享事物的条件CD等,你可能会有另一个叫做Base的父类,你会有CBaseDBaseBase继承,SharedBase继承,并根据条件启动一个实例,并将结果视为Base的实例。

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

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

最新更新