当前位置:  开发笔记 > 编程语言 > 正文

你能不用if语句写任何算法吗?

如何解决《你能不用if语句写任何算法吗?》经验,为你挑选了6个好方法。

这个网站让我感到幽默感 - http://www.antiifcampaign.com/但是在你使用if语句的每种情况下,多态性都可以工作吗?



1> Pascal Thive..:

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语句.
@hasen的意思是相似,但方式是**非常**不同.
@Andreas你的想法太小了.关于smalltalk的关键是它是所有对象(字符和整数,类,方法,浏览器,IDE本身),这使得smalltalk在调试,重构,TDD方面非常强大.实际上比任何最近的语言更强大.
它不是语言声明,而是一种方法.区别在于您只能对返回布尔值的表达式使用if; 这也意味着如果SmallTalk没有实现像`isA(class)`这样的方法,那么就不能使用`ifTrue:`来验证对象的类,这是OO语言应该避免的.当然,并非所有语言都是纯粹的OO,并且它们实现的功能应该使语言更强大(尽管这并不意味着功能使语言更安全).
我很害怕你的"代码是一个对象"的链接被破坏了.

2> Gordon Gusta..:

回答:**该网站反对使用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上的多态性是什么


那将是自我鞭挞程序员的事情.
+1用于回答基本问题,而不仅仅是回答标题.

3> Fabian Steeg..:

虽然不与OOP相关:在Prolog中,编写整个应用程序的唯一方法是不使用if语句.



4> jspcal..:

是的,实际上,你可以使用一种图灵完整的语言,它本身没有"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'和'*').



5> zebrabox..:

是的.if声明意味着分支在很多现代处理器上都会非常昂贵 - 尤其是PowerPC.许多现代PC都进行了大量的流水线重新排序,因此分支误预测可能会导致每个分支未命中大约30个周期的订单.
在控制台编程时,有时执行代码并忽略它比检查是否应该执行它更快!

C中的简单分支避免:

if (++i >= 15)
{
    i = 0;
)

可以重写为

 i = (i + 1) & 15;  

但是,如果你想看到一些真正的反如果fu,那么读这个

哦,在OOP问题上 - 我将用虚函数调用替换分支错误预测?不用了,谢谢....


当然,如果你正在优化if语句,那么你可能会浪费你的优化时间,这可能会更好地花在任何更复杂的结构上.

6> xpmatteo..:

"反if"运动背后的原因类似于Kent Beck所说的:

好的代码总是有小方法和小对象.只有通过将系统分解为许多小的状态和功能,您才能希望满足"一次且仅一次"的规则.我对这个想法有很多抵制,特别是来自经验丰富的开发人员,但我对系统做的任何事情都没有给它提供更多的帮助.

如果您不知道如何使用组合和继承来计算程序,那么您的类和方法将随着时间的推移而变得更大.当您需要进行更改时,最简单的方法是在某处添加IF.添加太多的IF,您的程序将变得越来越不可维护,并且最简单的方法是添加更多的IF.

你不具备把每一个IF到对象的协作; 但是当你知道如何:-)时这是一件非常好的事情

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有