Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 3.0 C语言中丑陋嵌套if-else树的简化方法#_C# 3.0 - Fatal编程技术网

C# 3.0 C语言中丑陋嵌套if-else树的简化方法#

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个状态,我应该将函数映射到每个参数的每个状态的组合(实际上更少,因为不是所有状态都有效,但有时仍然很多)。我可以将这些状态表示为哈希

有时候我在用C#3.5编写丑陋的if-else语句;我知道有一些不同的方法可以通过表驱动开发、类层次结构、匿名方法等来简化这一过程。 问题在于,与传统的丑陋的if-else语句相比,替代方案的传播范围仍然较小,因为没有惯例

如果else对C#3.5正常,嵌套的深度是多少?如果不是第一种方法,您希望看到哪些方法而不是嵌套的?第二个

如果我有10个输入参数,每个参数有3个状态,我应该将函数映射到每个参数的每个状态的组合(实际上更少,因为不是所有状态都有效,但有时仍然很多)。我可以将这些状态表示为哈希表键和处理程序(lambda),如果键匹配,将调用该处理程序

它仍然是表驱动、数据驱动开发思想和模式匹配的混合体

我正在寻找的是对C语言的扩展,比如这种脚本编写方法(C 3.5相当于脚本编写)
简单。获取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