Beispielcode zur Erklärung des Banana Monkey Jungle-Problems von Joe Armstrong [geschlossen]

14

In dem Buch Coders at work erklärte Joe Armstrong:

Ich denke, der Mangel an Wiederverwendbarkeit tritt in objektorientierten Sprachen auf, nicht in funktionalen Sprachen. Weil das Problem mit objektorientierten Sprachen darin besteht, dass sie all diese implizite Umgebung haben, die sie mit sich herumtragen. Sie wollten eine Banane, aber Sie bekamen einen Gorilla, der die Banane und den gesamten Dschungel hielt

Ich verstehe es hier nicht ganz. Wenn das Problem darin besteht, eine Banane zu bekommen, können wir die gesamte Logik hinter der Funktion 'getBanana' zusammenfassen. Wie sind Affen und Dschungel in diesem Zusammenhang involviert? Könnte jemand ein Code-Snippet schreiben, das das Problem leichter verständlich erklärt, beispielsweise die Tatsache demonstrieren, dass für das BananaObjekt das Monkeyund die JungleObjekte initiiert werden müssen, bitte?

Kha Nguyễn
quelle
Schade, dass dies geschlossen wurde - es gab einige gute Diskussionen. Schauen Sie sich erstklassige Funktionen als Starter an.
Robbie Dee
1
@Euphoric Discussion Type Fragen sind eigentlich erlaubt, aber welche Fragen subjektiv sind, könnte ... subjektiv sein.
Robbie Dee
2
Ich glaube, dass dieses Interview geführt wurde, bevor Joe Armstrong seine Doktorarbeit schrieb. Während seiner Doktorarbeit schreibt, Armstrong über die gelernt wirkliche Definition von OO, und erkannte , dass Erlang tatsächlich gründlich objektorientiert ist in der Tat von all aktuellen Mainstream - Sprache ist Erlang wahrscheinlich die meisten objektorientierte Sprache! Er hätte diese Aussage nicht auf diese Weise gemacht, wenn er gewusst hätte, dass Erlang tatsächlich eine OO-Sprache ist. Worüber er spricht, ist die Umgebungsautorität , die absolut nichts mit OO zu tun hat.
Jörg W Mittag
1
Hallo, bei meiner Frage geht es darum, einen Beispielcode bereitzustellen, der mir (und anderen) hilft, das Problem besser zu verstehen. Jedes Code-Snippet, das das Problem demonstriert, ist akzeptabel, nicht nur die Meinung.
Kha Nguyễn

Antworten:

16

Er deutet auf eine Tatsache hin, dass die Mehrheit der echten OOP-Programme die Trennung von Bedenken nicht respektiert. Zum Beispiel könnten Sie Klassen haben:

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

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

public class Jungle
{
}

Wenn Sie verwenden Banana, ist es transitiv notwendig, auch von Monkeyund abhängig zu sein Jungle.

Aber ich würde absolut nicht zustimmen, dass dies ein Problem mit OOP ist und dass der funktionale Stil es irgendwie nicht hat. Dies kann in OOP mit der Einführung der richtigen Abstraktion leicht behoben werden.

Das Problem besteht eher darin, dass Entwickler sich nicht um die Trennung von Bedenken kümmern. Und ich hätte keine Angst zu behaupten, dass die Mehrheit der OOP-Programmierer Anfänger sind, während funktionale Programmierer einige Erfahrungen haben, die sie motivieren, ihren Code richtig zu trennen.

Mögliche Abstraktion könnte sein:

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

public interface IBananaOwner
{
}

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

public class Jungle
{
}

Auf diese Weise wissen Sie, dass Bananader Eigentümer hat, aber es muss nicht sein Monkey. Es kann alles sein. Und es beschränkt die BananaMöglichkeiten des Eigentümers auf nur Operationen, die durch definiert sind IBananaOwner, was das Denken vereinfacht.

Euphorisch
quelle
Und umgekehrt, während funktionale Sprachen sofort erstklassige Funktionen unterstützen - das heißt nicht, dass Funktion X ohne Nebenwirkungen sicher von Funktion Y genutzt werden kann.
Robbie Dee
Obwohl Sie einen hervorragenden Punkt machen, denke ich, dass Sie hier etwas von der Piste abkommen. Das Zitat erwähnt ausdrücklich die Umgebung, nicht wie der Code entworfen wurde.
Robbie Dee
@RobbieDee Die Monkeyund Junglesind eine Umgebung für Banana. Durch die Einführung von Abstraktion wie IBananaOwnerwird die Umgebung explizit. Und wie diese Umgebung gestaltet ist, ist das, worum es bei seinem Problem geht.
Euphoric
Sie können sehr gut in Ordnung , aber ich kann nicht umhin denken , gelesen zu haben dies unter anderem , dass der Elefant im Raum (ein anderes Tier hinzufügen) ist , dass das Problem in der richtigen Zusammensetzung der Funktionen ist die funktionale Programmierung, historisch gesehen , hat lieh sich mehr.
Robbie Dee
@RobbieDee Sie können das, was ich geschrieben habe, nicht durch eine einfache Funktionskomposition ersetzen. Zumindest nicht außerhalb von Spielzeugbeispielen. In der Praxis sind Dinge wie komplexe Generika, Typklassen, Monaden und andere erforderlich, um das OOP-Design vollständig zu ersetzen. Und das ändert nur eine Art von Komplexität für eine andere Art.
Euphoric
13

Gorillas sind keine Affen!

Abgesehen davon beantworten Sie Ihre eigene Frage mit " Wir können die gesamte Logik hinter der Funktion 'getBanana' zusammenfassen ". Ich möchte nur eine Banane, aber um sie zu bekommen, muss ich getBananaein Objekt aufrufen , z. B. eine Instanz der GorillaKlasse. Dieses Bananenobjekt enthält dann wahrscheinlich einen Verweis auf den Gorilla, zu dem es gehört, und dieses Gorilla-Objekt hat wiederum einen Verweis auf den Wald, zu dem es gehört. Also bitte ich um eine Banane, aber dahinter steckt der gesamte Dschungel.

Es ist ein extremes Beispiel und wird nicht immer so schlimm sein. Es ist jedoch nicht ungewöhnlich, dass Sie ein solches OO-System haben. Um diese getBananaMethode zu testen, muss ich einen ganzen Wald instanziieren oder verspotten.

David Arno
quelle
1
Dies beantwortet die Frage nicht, da es keinen Beispielcode hat ...
Robbie Dee