C# 3.0 C语言中丑陋嵌套if-else树的简化方法#
有时候我在用C#3.5编写丑陋的if-else语句;我知道有一些不同的方法可以通过表驱动开发、类层次结构、匿名方法等来简化这一过程。 问题在于,与传统的丑陋的if-else语句相比,替代方案的传播范围仍然较小,因为没有惯例 如果else对C#3.5正常,嵌套的深度是多少?如果不是第一种方法,您希望看到哪些方法而不是嵌套的?第二个 如果我有10个输入参数,每个参数有3个状态,我应该将函数映射到每个参数的每个状态的组合(实际上更少,因为不是所有状态都有效,但有时仍然很多)。我可以将这些状态表示为哈希表键和处理程序(lambda),如果键匹配,将调用该处理程序 它仍然是表驱动、数据驱动开发思想和模式匹配的混合体 我正在寻找的是对C语言的扩展,比如这种脚本编写方法(C 3.5相当于脚本编写)C# 3.0 C语言中丑陋嵌套if-else树的简化方法#,c#-3.0,C# 3.0,有时候我在用C#3.5编写丑陋的if-else语句;我知道有一些不同的方法可以通过表驱动开发、类层次结构、匿名方法等来简化这一过程。 问题在于,与传统的丑陋的if-else语句相比,替代方案的传播范围仍然较小,因为没有惯例 如果else对C#3.5正常,嵌套的深度是多少?如果不是第一种方法,您希望看到哪些方法而不是嵌套的?第二个 如果我有10个输入参数,每个参数有3个状态,我应该将函数映射到每个参数的每个状态的组合(实际上更少,因为不是所有状态都有效,但有时仍然很多)。我可以将这些状态表示为哈希
简单。获取if的主体并从中生成一个方法 这是因为大多数if语句的形式如下:
if (condition):
action()
在其他情况下,更具体地说:
if (condition1):
if (condition2):
action()
简化为:
if (condition1 && condition2):
action()
我是三元运算符的忠实粉丝,它被很多人忽视了。它非常适合根据条件为变量赋值。像这样
foobarString = (foo == bar) ? "foo equals bar" : "foo does not equal bar";
请尝试获取更多信息
它不会解决所有的问题,但非常经济。如果整个目的是根据各种条件的状态为某个变量指定不同的值,我使用ternery运算符
如果If-Else子句正在执行单独的功能块。而且条件很复杂,可以通过创建临时布尔变量来保存复杂布尔表达式的真/假值来简化。这些变量应适当命名,以表示复杂表达式正在计算的业务含义。然后使用If else synatx中的布尔变量,而不是复杂的布尔表达式 我发现自己有时会做的一件事是反转条件,然后返回
;连续几次这样的测试可以帮助减少if
和else
的嵌套尝试使用策略或命令之类的模式我知道这不是你想要的答案,但如果没有上下文,你的问题很难回答。问题是,重构这种东西的方式实际上取决于您的代码、它在做什么以及您试图完成什么。如果您说过要在这些条件中检查对象的类型,我们可以抛出一个类似“使用多态性”的答案,但有时您实际上只需要一些If语句,有时这些语句可以重构为更简单的语句。如果没有代码示例,很难说您属于哪个类别。几年前,一位讲师告诉我3是一个神奇的数字。当他将它应用于其他语句时,他建议如果我需要更多的3个if,那么我应该使用case语句
switch (testValue)
{
case = 1:
// do something
break;
case = 2:
// do something else
break;
case = 3:
// do something more
break;
case = 4
// do what?
break;
default:
throw new Exception("I didn't do anything");
}
开关(测试值)
{
案例=1:
//做点什么
打破
案例=2:
//做点别的
打破
案例=3:
//多做点什么
打破
案例=4
//做什么?
打破
违约:
抛出新异常(“我什么都没做”);
}
如果您嵌套的If语句深度超过3,那么您可能应该将其视为有更好方法的迹象。可能像Avirdlg建议的那样,将嵌套的if语句分离为1个或多个方法。如果您觉得自己完全被多个If-else语句所困扰,那么我会将所有If-else语句包装到一个方法中,这样就不会弄脏其他代码。有非常古老的“形式主义”试图封装计算许多可能独立变量的极其复杂的表达式,例如“决策表”:
但是,我将在这里加入合唱团,支持所提到的明智使用三元运算符的想法,如果可能的话,确定最不可能的条件,如果满足这些条件,可以通过排除它们来终止其余的评估,并添加。。。反过来说。。。试图找出最可能的条件和状态,使您能够在不测试“边缘”案例的情况下继续进行
米里亚姆(上面)的建议很吸引人,甚至很优雅,就像“概念艺术”;我实际上要尝试一下,试图“包容”我的怀疑,即它将导致更难维护的代码
我务实的一面说,这里没有“一刀切”的答案,没有非常具体的代码示例,也没有对条件及其交互的完整描述
我非常喜欢“标志设置”:这意味着每当我的应用程序进入一些不太常见的“模式”或“状态”时,我都会设置一个布尔标志(对于类来说甚至可能是静态的):对我来说,这简化了以后编写复杂的if/then else计算
最好的办法是,Bill在简单的情况下,您应该能够进行基本的功能分解。对于更复杂的场景,我非常成功地使用了。好问题。“条件复杂性”是一种代码味道。他是你的朋友
条件逻辑在其幼年时期是无辜的,因为它很容易理解并包含在
几行代码。不幸的是,它很少能很好地老化。您实现了几个新特性和
突然间,你的条件逻辑变得复杂和扩展。[Joshua Kerevsky:重构到模式]
要避免嵌套if块,最简单的方法之一就是学会使用
我发现的另一件事很好地简化了事情,使您的代码能够自我记录,那就是
其他与之相关的有价值的技术
double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};
double disabilityAmount() {
if (isNotEligableForDisability()) return 0;
// compute the disability amount
let x=
match cond1, cond2, name with
| _, _, "Bob" -> 9000 // Bob gets 9000, regardless of cond1 or 2
| false, false, _ -> 0
| true, false, _ -> 1
| false, true, _ -> 2
| true, true, "" -> 0 // Both conds but no name gets 0
| true, true, _ -> 3 // Cond1&2 give 3