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();