示例代码解释Joe Armstrong的香蕉猴丛林问题[关闭]


14

乔·阿姆斯特朗(Joe Armstrong)在《工作中的编码员》一书中指出:

我认为缺乏可重用性的是面向对象的语言,而不是功能语言。因为面向对象语言的问题是他们拥有了它们所伴随的所有隐式环境。你想要一个香蕉,但是你得到的是一只大猩猩,抱着香蕉和整个丛林

我在这里不太明白。如果问题出在香蕉上,我们可以将所有逻辑封装在“ getBanana”函数的后面。猴子和丛林在这种情况下是如何参与的。有人可以写一个代码片段来以更容易理解的方式解释问题吗,例如,说明该Banana对象需要Monkeyand Jungle对象才能被启动的事实?



遗憾的是,此事已关闭-引起了很好的讨论。看看一流的功能作为入门。
罗比·迪

1
@Euphoric讨论类型的问题实际上是允许的,但是哪些问题是主观的……可以是主观的。
罗比·迪

2
我相信这次采访是在乔·阿姆斯特朗撰写博士论文之前进行的。在撰写博士学位论文时,阿姆斯特朗了解了OO 的真正定义,并意识到Erlang实际上是完全面向对象的,实际上,在当前所有主流语言中,Erlang可能都是面向对象的语言!如果他知道Erlang实际上是一种OO语言,那么他就不会那样做。他所说的是环境权威,它绝对与OO无关。
约尔格W¯¯米塔格

1
嗨,我的问题是提供一些示例代码,以帮助我(和其他人)更好地理解问题。任何表明问题的代码段都是可以接受的,而不仅仅是意见。
KhaNguyễn18年

Answers:


16

他暗示了一个事实,即大多数真正的OOP程序都不尊重关注点分离。例如,您可以具有以下类:

public class Banana
{
    public Monkey Owner {get;}
}

public class Monkey
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

如果使用Banana,则必须暂时依赖MonkeyJungle

但是我完全不同意这是OOP的问题,而某种程度上没有它的功能风格。通过引入权利抽象,可以轻松地在OOP中解决此问题。

问题更多是开发人员不关心关注点分离。而且我不怕断言大多数OOP程序员是新手,而函数式程序员则具有一定的经验,可以激发他们适当地分离代码。

可能的抽象可能是:

public class Banana
{
    public IBananaOwner Owner {get;}
}

public interface IBananaOwner
{
}

public class Monkey : IBananaOwner
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

这样,您知道Banana拥有所有者,但不必一定是Monkey。可以是任何东西。而且它将Banana所有者可以做的事情仅限于由定义的操作IBananaOwner,从而简化了推理。


相反,尽管功能语言开箱即用地支持一流的功能-但这并不是说功能X可以安全地被功能Y所使用,而不会产生副作用。
罗比·迪

尽管您提出了一个很好的观点,但我认为您在这里可能会稍微偏离滑雪道。引号明确提到环境,而不是代码的设计方式。
罗比·迪

@RobbieDee MonkeyJungle是的环境Banana。通过引入像这样IBananaOwner的抽象,环境变得清晰。而如何设计这种环境就是他的问题所在。
欣快的

你很可能是正确的,但我不禁想到看了除其他事项外,在室内(添加其他动物)的大象是唯一的问题是在其功能编程,从历史上看,具有的功能正确的成分借给更多。
罗比·迪

@RobbieDee您不能用简单的函数组合替换我写的内容。至少不是外界玩具示例问题。实际上,要完全替代OOP设计,诸如复杂的泛型,类型类,monad之类的东西是必需的。这只是将一种复杂性改变为另一种。
欣快的

13

大猩猩不是猴子!

撇开这一点,您可以用“ 我们可以封装功能'getBanana'后面的所有逻辑 ”回答您自己的问题。我想要的只是一根香蕉,但是要得到它,我需要调用getBanana某个对象,例如,Gorilla类的实例。然后,该香蕉对象可能包含对它所属的大猩猩的引用,而该大猩猩对象又将对它所属的森林进行引用。所以我要一个香蕉,但整个香蕉都被包裹在香蕉后面。

这是一个极端的例子,并不会总是那么糟糕。但是,最终出现这样的OO系统并不少见。因此,要测试该getBanana方法,我需要实例化或模拟整个森林。


1
这没有回答问题,因为它没有示例代码...
Robbie Dee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.