Programming languages 为什么';如果';声明被认为是邪恶的?

Programming languages 为什么';如果';声明被认为是邪恶的?,programming-languages,if-statement,Programming Languages,If Statement,我刚从北京来。在其中一节课中,我们讨论了编程语言中的邪恶关键词,提出这个主题的人确信,if语句是绝对邪恶的。他的替代方案是使用创建函数。你能解释一下为什么是邪恶的吗 我知道你可以写非常难看的代码滥用如果。但是我不认为它有那么糟糕。谓词的唯一问题(在替换if语句方面)是仍然需要测试它们: function void Test(Predicate<int> pr, int num) { if (pr(num)) { /* do something */ } el

我刚从北京来。在其中一节课中,我们讨论了编程语言中的邪恶关键词,提出这个主题的人确信,
if
语句是绝对邪恶的。他的替代方案是使用创建函数。你能解释一下为什么
是邪恶的吗


我知道你可以写非常难看的代码滥用
如果
。但是我不认为它有那么糟糕。

谓词的唯一问题(在替换
if
语句方面)是仍然需要测试它们:

function void Test(Predicate<int> pr, int num) 
{
    if (pr(num))
    { /* do something */ }
    else
    { /* do something else */ }
}
函数无效测试(谓词pr,int num)
{
if(pr(num))
{/*做点什么*/}
其他的
{/*做点别的*/}
}

你当然可以使用terniary操作符(
?:
),但那只是一个
如果
变相声明…

我同意你的观点<他错了。这样的事情你可以做得太过分,太聪明了,不利于你自己


用谓词而不是ifs创建的代码维护和测试起来会很糟糕。

老实说,这取决于你在做什么

如果您有一个简单的
If..else
语句,为什么要使用
谓词

如果可以,使用
开关进行较大的
If
替换,然后如果选择对大型操作使用谓词(如果有意义,否则您的代码将成为维护的噩梦),则使用它


这家伙对我来说似乎有点迂腐。用谓词替换所有的
if
,简直是胡说八道。

还有另一种意义上的
if
可能是邪恶的:当它代替多态性时

例如

而不是

 animal.emitSound()
但基本上,if是一个完全可以接受的工具。当然,它可以被滥用和滥用,但它远没有达到后藤的地位。

今年早些时候开始了这项运动。主要前提是许多嵌套的if语句通常可以用多态性替换


我想看一个使用谓词的例子。这更符合函数式编程吗?

我不得不说,我最近开始将if语句视为一种代码气味:尤其是当您发现自己多次重复相同的条件时。但是关于代码气味,您需要了解一些事情:它们并不一定意味着代码是坏的。他们只是说代码很可能是坏的

例如,Martin Fowler将注释列为代码气味,但我不会认真对待那些说“注释是邪恶的,不要使用它们”的人


一般来说,如果可能的话,我更喜欢使用多态性而不是if语句。这只会减少犯错误的空间。我倾向于发现,很多时候,使用条件句也会导致大量的tramp参数(因为您必须将形成条件句所需的数据传递给适当的方法).

也许在量子计算中,不使用IF语句是一种明智的策略,而是让计算的每一个分支继续进行,并且只在结束时让函数“折叠”以获得有用的结果。

完整代码中的一段很好的引用:

编写代码,就好像维护你的程序的人是一个暴力的精神病患者 知道你住在哪里。
-匿名的


瞧,简单点。如果应用程序的可读性将通过在特定区域使用谓词得到增强,请使用它。否则,请使用“if”并继续。谓词来自逻辑/声明性编程语言,如PROLOG。对于某些类型的问题,比如约束求解,它们可以说比很多冗长的一步一步的解决方法优越——如果这样做了,那么就做这些废话。用命令式语言解决的冗长而复杂的问题可以在PROLOG中用几行代码完成

还有可伸缩编程的问题(由于向多核、web等的发展)。If语句和命令式编程通常倾向于循序渐进,不可伸缩。不过,逻辑声明和lambda演算描述了如何解决问题,以及问题可以分解成哪些部分。因此,执行该代码的解释器/处理器可以有效地将代码分解为多个片段,并将其分发到多个CPU/内核/线程/服务器


绝对不是到处都有用;我不想尝试用谓词而不是if语句编写设备驱动程序。但是,是的,我认为要点可能是合理的,至少值得熟悉,如果不是一直使用的话。

这可能归结为希望降低代码圈复杂度,并减少函数中的分支点数量。如果一个函数很容易分解成许多较小的函数,每个函数都可以测试,那么您可以降低复杂性并使代码更易于测试。

IMO:
我怀疑他是想挑起一场辩论,让人们思考“如果”的滥用。没有人会认真地建议完全避免这种编程语法的基本构造,是吗?

if
语句很少被认为是“邪恶”的,因为它不像
goto
或可变全局变量那样——甚至后者实际上也不是普遍和绝对邪恶的。我建议将这一说法视为有点夸张

它还很大程度上取决于您的编程语言和环境。在支持模式匹配的语言中,您将拥有强大的工具来替换
if
。但是如果你用C语言编程一个低级微控制器,用函数指针代替
if
s将是错误的一步。因此,我将主要考虑在OOP编程中替换<代码>如果 s,因为在函数语言中,<代码>如果不是习惯用法,W
 animal.emitSound()
int sum(int a, int b) {
    return a + b;
}
int sum(int a, int b) {
    if (a == 0 && b == 0) {
        return 0;
    }
    return a + b;
}
int sum(int a, int b) {
    if (a == 0 || b == 0) {
        return 0;
    }
    return a + b;
}
if(animaltype = bird) {
     squawk();
} else if(animaltype = dog) {
     bark();
}
animal.makeSound();
if(logging) {
      log.write("Did something");
}
this.logger = new NullLogger();    // logger.log() does nothing
this.logger = new StdOutLogger();  // logger.log() writes to stdout
if(user.getCreditRisk() > 50) {
     decision = thoroughCreditCheck();
} else if(user.getCreditRisk() > 20) {
     decision = mediumCreditCheck();
} else {
     decision = cursoryCreditCheck();
}
decision = getCreditCheckStrategy(user.getCreditRisk()).decide();