我经常看到(有时是自己写)这样的结构:
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 值的不同(也许是复杂的)事情。
答案 0 :(得分:1)
由于我没有看到其他建议,因此我将一些建议排除在外,看看它们是否正是您要的。
首先,如果表上有OOP,则继承可以表示这种共享行为。您要做的是封装A
,B
和Shared
类中ASpecific
和BSpecific
共享的行为,其中{{1} }和ASpecific
继承自BSpecific
。然后,如果是Shared
或A
,则分别旋转B
或ASpecific
的实例,然后将其视为BSpecific
的实例。 。如果您有不使用共享事物的条件Shared
,C
等,则可能有另一个名为D
的父类,并且您有{{1} },Base
继承自CBase
,DBase
继承自Base
,并根据条件旋转一个实例,并将结果视为Shared
的实例
第二,当需要共享内容时,可以通过将A特定行为和B特定行为传递给共享方法来使用控制反转。您可以将OOP用于此编程或纯函数式编程。与后者配合使用(因为前者与上述解决方案相似,并且可能不太理想),因此您将拥有一个Base
函数,该函数将函数Base
作为参数。函数shared
的签名要求传递共享对象。然后,如果f
,请使用执行{{1的函数(指针或匿名内联)调用f
}}特定的东西传递给共享对象;否则,如果是A
,请使用对传递到其中的共享对象执行shared
特定内容的函数来调用A
。
如果您真正想避免的是嵌套,则还可以将B
内容带出并使其旋转共享,这是已声明但未在更高范围中实例化的;然后,以后再分别检查shared
和B
并知道在这些情况下if (A || B) { … }
将具有较早版本所需的设置。