这个网站让我感到幽默感 - http://www.antiifcampaign.com/但是在你使用if语句的每种情况下,多态性都可以工作吗?
Smalltalk被认为是一种"真正的"面向对象的语言,没有"if"语句,它没有"for"语句,没有"while"语句.还有其他一些例子(比如Haskell),但这是一个很好的例子.
引用Smalltalk没有"if"声明:
一些观众可能会认为这是证实他们怀疑Smalltalk很奇怪的证据,但我要告诉你的是:
"if"语句是面向对象语言中的憎恶.
为什么?好吧,OO语言由类,对象和方法组成,而"if"语句不可避免地都不是.你不能用OO方式写"if".它不应该存在.与其他一切一样,条件执行应该是一种方法.一种方法是什么?布尔.
现在,有趣的是,在Smalltalk中,Boolean有一个名为ifTrue的方法:ifFalse :(这个名称现在看起来很奇怪,但现在要传递它).它在布尔值中是抽象的,但布尔值有两个子类:True和False.该方法传递两个代码块.在True中,该方法只运行真实案例的代码.在False中,它运行错误案例的代码.这是一个有希望解释的例子:
(x >= 0) ifTrue: [ 'Positive' ] ifFalse: [ 'Negative' ]你应该能够在那里看到ifTrue:和ifFalse :. 别担心他们不在一起.
表达式(x> = 0)的计算结果为true或false.说这是真的,那么我们有:
true ifTrue: [ 'Positive' ] ifFalse: [ 'Negative' ]我希望这很明显会产生'积极'.
如果它是假的,我们有:
false ifTrue: [ 'Positive' ] ifFalse: [ 'Negative' ]这会产生'负面'.
好的,这就是它的完成方式.这有什么好处的?那么,用其他语言你可以做到这一点?更严重的是,答案是这种语言没有任何特殊情况.一切都可以用OO方式完成,一切都以OO方式完成.
我绝对建议阅读整个帖子,Code也是同一作者的对象.
回答:**该网站反对使用if语句来检查对象是否具有特定类型.这完全不同于if (foo == 5)
.使用它是不好的,如果使用if (foo instanceof pickle)
替代方法,使用多态,促进封装,使代码无限更容易调试,维护和扩展.
反对if
一般情况(根据条件做某件事)不会给你什么.注意这里的所有其他答案是如何做出决定的,那么真正的区别是什么呢?
解释多态性背后的原因:
采取这种情况:
void draw(Shape s) { if (s instanceof Rectangle) //treat s as rectangle if (s instanceof Circle) //treat s as circle }
如果您不必担心对象的特定类型,则可以更好地概括对象是如何处理的.
void draw(Shape s) { s.draw(); }
这将移动如何将形状绘制到形状类本身的逻辑,因此我们现在可以将所有形状视为相同.这样,如果我们想要添加一种新形状,我们所要做的就是编写类并给它一个draw方法,而不是修改整个程序中的每个条件列表.
这个想法在今天的编程中无处不在,接口的整个概念都是关于多态的.(Shape是定义某个行为的接口,允许我们处理在我们的方法中实现Shape接口的任何类型.)动态编程语言更进一步,允许我们将支持必要操作的任何类型传递给方法.哪个看起来更好:(python样式伪代码)
def multiply(a,b): if (a is string and b is int): //repeat a b times. if (a is int and b is int): //multiply a and b
或使用多态:
def multiply(a,b): return a*b
您现在可以使用任何支持*运算符的2种类型,允许您将该方法用于尚未创建事件的类型.
请参阅polymorphism,stackoverflow上的多态性是什么
虽然不与OOP相关:在Prolog中,编写整个应用程序的唯一方法是不使用if语句.
是的,实际上,你可以使用一种图灵完整的语言,它本身没有"if",只允许"while"语句:
http://cseweb.ucsd.edu/classes/fa08/cse200/while.html
至于OO设计,在某些情况下使用继承模式而不是基于类型字段的开关是有意义的......但这并不总是可行或必然是可取的.
@ennuikiller:条件只是语法糖的问题:
if (test) body; is equivalent to x=test; while (x) {x=nil; body;}
if-then-else有点冗长:
if (test) ifBody; else elseBody; is equivalent to x = test; y = true; while (x) {x = nil; y = nil; ifBody;} while (y) {y = nil; elseBody;}
原始数据结构是列表列表.如果它们是相同长度的列表,你可以说2个标量是相等的.你可以使用头/尾运算符同时循环它们,看看它们是否停在同一点.
当然,这些都可以用宏包裹起来.
最简单的图灵完整语言可能是iota.它只包含2个符号('i'和'*').
是的.if
声明意味着分支在很多现代处理器上都会非常昂贵 - 尤其是PowerPC.许多现代PC都进行了大量的流水线重新排序,因此分支误预测可能会导致每个分支未命中大约30个周期的订单.
在控制台编程时,有时执行代码并忽略它比检查是否应该执行它更快!
C中的简单分支避免:
if (++i >= 15) { i = 0; )
可以重写为
i = (i + 1) & 15;
但是,如果你想看到一些真正的反如果fu,那么读这个
哦,在OOP问题上 - 我将用虚函数调用替换分支错误预测?不用了,谢谢....
"反if"运动背后的原因类似于Kent Beck所说的:
好的代码总是有小方法和小对象.只有通过将系统分解为许多小的状态和功能,您才能希望满足"一次且仅一次"的规则.我对这个想法有很多抵制,特别是来自经验丰富的开发人员,但我对系统做的任何事情都没有给它提供更多的帮助.
如果您不知道如何使用组合和继承来计算程序,那么您的类和方法将随着时间的推移而变得更大.当您需要进行更改时,最简单的方法是在某处添加IF.添加太多的IF,您的程序将变得越来越不可维护,并且最简单的方法是添加更多的IF.
你不具备把每一个IF到对象的协作; 但是当你知道如何:-)时这是一件非常好的事情