简化一个典型的(?)条件结构
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 Shared
、ASpecific
和 BSpecific
中,其中 ASpecific
和 BSpecific
继承自 Shared
。然后,如果 A
或 B
,则分别启动 ASpecific
或 BSpecific
的实例,然后将其视为 Shared
的实例.如果你有条件 C
、D
等不使用共享的东西,你可能有另一个父 class 叫 Base
并且你有CBase
, DBase
继承自 Base
, Shared
继承自 Base
, 并根据条件旋转一个实例并将结果视为 Base
.
其次,当需要共享内容时,您可以通过将特定于 A 和特定于 B 的行为传递给共享方法来使用控制反转。您可以为此使用 OOP 或纯函数式编程。使用后者(因为前者与上述解决方案类似,可能不太好),您将有一个 shared
函数,该函数将函数 f
作为参数。函数 f
将有一个签名,要求传入共享对象。然后,如果 A
,调用 shared
并使用函数(指针或匿名内联)执行 A
-特定于传递给它的共享对象的东西;否则,如果 B
,调用 shared
并使用一个函数对传递给它的共享对象执行 B
特定的操作。
如果你真正想要避免的只是嵌套,你也可以把 if (A || B) { … }
的东西拿出来,让它旋转起来 shared ,它在更高的范围内被声明但没有实例化;然后,稍后,分别检查 A
和 B
并知道在这些情况下 shared
将具有之前所需的设置。
我经常看到(有时我自己也写过)这样的结构:
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 Shared
、ASpecific
和 BSpecific
中,其中 ASpecific
和 BSpecific
继承自 Shared
。然后,如果 A
或 B
,则分别启动 ASpecific
或 BSpecific
的实例,然后将其视为 Shared
的实例.如果你有条件 C
、D
等不使用共享的东西,你可能有另一个父 class 叫 Base
并且你有CBase
, DBase
继承自 Base
, Shared
继承自 Base
, 并根据条件旋转一个实例并将结果视为 Base
.
其次,当需要共享内容时,您可以通过将特定于 A 和特定于 B 的行为传递给共享方法来使用控制反转。您可以为此使用 OOP 或纯函数式编程。使用后者(因为前者与上述解决方案类似,可能不太好),您将有一个 shared
函数,该函数将函数 f
作为参数。函数 f
将有一个签名,要求传入共享对象。然后,如果 A
,调用 shared
并使用函数(指针或匿名内联)执行 A
-特定于传递给它的共享对象的东西;否则,如果 B
,调用 shared
并使用一个函数对传递给它的共享对象执行 B
特定的操作。
如果你真正想要避免的只是嵌套,你也可以把 if (A || B) { … }
的东西拿出来,让它旋转起来 shared ,它在更高的范围内被声明但没有实例化;然后,稍后,分别检查 A
和 B
并知道在这些情况下 shared
将具有之前所需的设置。