Exemple de code pour expliquer le problème de Banana Monkey Jungle par Joe Armstrong [fermé]

14

Dans le livre Coders at work, Joe Armstrong a déclaré que:

Je pense que le manque de réutilisabilité vient dans les langages orientés objet, pas dans les langages fonctionnels. Parce que le problème avec les langages orientés objet, c'est qu'ils ont tout cet environnement implicite qu'ils emportent avec eux. Vous vouliez une banane mais ce que vous avez obtenu était un gorille tenant la banane et toute la jungle

Je ne comprends pas tout à fait ici. Si le problème est d'obtenir une banane, nous pouvons encapsuler toute la logique derrière la fonction 'getBanana'. Comment le singe et la jungle sont-ils impliqués dans ce contexte? Quelqu'un pourrait-il écrire un extrait de code qui explique le problème d'une manière plus facile à comprendre, par exemple, démontrer le fait que l' Bananaobjet nécessite l' initialisation des objets Monkeyet Jungle, s'il vous plaît?

Kha Nguyễn
la source
Dommage que cela ait été clos - cela a donné lieu à de bonnes discussions. Regardez dans les fonctions de première classe comme un démarreur.
Robbie Dee
1
@Euphoric Les questions de type Discussion sont en fait autorisées mais celles qui sont subjectives pourraient être ... subjectives.
Robbie Dee
2
Je pense que cette interview a eu lieu avant que Joe Armstrong n'écrive sa thèse de doctorat. Lors de la rédaction de sa thèse de doctorat, Armstrong a découvert la véritable définition de l'OO et s'est rendu compte qu'Erlang est en fait complètement orienté objet, en fait, de toutes les langues courantes actuelles, Erlang est probablement le langage le plus orienté objet! Il n'aurait pas fait cette déclaration de cette façon s'il avait su qu'Erlang était en fait une langue OO. Ce dont il parle, c'est de l'autorité ambiante , qui n'a absolument rien à voir avec OO.
Jörg W Mittag
1
Salut, ma question est de fournir un exemple de code qui m'aide (ainsi que d'autres) à mieux comprendre le problème. Tout extrait de code qui illustre le problème est acceptable, pas seulement l'opinion.
Kha Nguyễn

Réponses:

16

Il fait allusion à un fait, que la majorité des vrais programmes de POO ne respectent pas la séparation des préoccupations. Par exemple, vous pourriez avoir des classes:

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

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

public class Jungle
{
}

Si vous utilisez Banana, il est transitoirement nécessaire de dépendre également de Monkeyet Jungle.

Mais je ne serais pas du tout d'accord pour dire que c'est un problème avec la POO et que le style fonctionnel ne l'a pas. Cela peut facilement être corrigé dans la POO avec l'introduction d'une abstraction correcte.

Le problème concerne davantage les développeurs qui ne se soucient pas de la séparation des préoccupations. Et je n'aurais pas peur d'affirmer que la majorité des programmeurs OOP sont des novices, alors que les programmeurs fonctionnels ont une certaine expérience, ce qui les motive à séparer correctement leur code.

L'abstraction possible pourrait être:

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

public interface IBananaOwner
{
}

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

public class Jungle
{
}

De cette façon, vous savez qu'il Bananaa un propriétaire, mais ce n'est pas obligatoire Monkey. Ça peut être n'importe quoi. Et il limite ce que peut Bananafaire le propriétaire aux seules opérations définies par IBananaOwner, ce qui simplifie le raisonnement.

Euphorique
la source
Et inversement, alors que les langages fonctionnels prennent en charge des fonctions de première classe, cela ne veut pas dire que la fonction X peut être consommée en toute sécurité par la fonction Y sans effets secondaires.
Robbie Dee
Bien que vous fassiez un excellent point, je pense que vous allez peut-être légèrement hors piste ici. La citation mentionne explicitement l' environnement et non la façon dont le code a été conçu.
Robbie Dee
@RobbieDee Les Monkeyet Junglesont un environnement pour Banana. En introduisant l'abstraction comme IBananaOwner, l'environnement devient explicite. Et la façon dont cet environnement est conçu est la raison de son problème.
Euphoric
Vous pouvez très bien avoir raison, mais je ne peux m'empêcher de penser qu'après avoir lu cela , l'éléphant dans la pièce (pour ajouter un autre animal), c'est que le problème est dans la composition correcte des fonctions que la programmation fonctionnelle, historiquement, a se prêtait à plus.
Robbie Dee
@RobbieDee Vous ne pouvez pas remplacer ce que j'ai écrit avec une composition de fonction simple. Du moins pas en dehors des problèmes d'exemples de jouets. Dans la pratique, pour remplacer complètement la conception OOP, des choses comme des génériques complexes, des classes de types, des monades et autres sont nécessaires. Et cela ne fait que changer un type de complexité pour un autre.
Euphoric
13

Les gorilles ne sont pas des singes!

En laissant cela de côté, vous répondez à votre propre question par " nous pouvons encapsuler toute la logique derrière la fonction 'getBanana' ". Tout ce que je veux, c'est une banane, mais pour l'obtenir, je dois appeler getBananaun objet, par exemple une instance de la Gorillaclasse. Cet objet banane contient alors probablement une référence au gorille auquel il appartient et cet objet gorille aura à son tour une référence à la forêt à laquelle il appartient. Je demande donc une banane, mais derrière cela se trouve toute la jungle.

C'est un exemple extrême et ne sera pas toujours aussi mauvais. Mais il n'est pas rare de se retrouver avec un système OO comme celui-ci. Et donc, pour tester cette getBananaméthode, j'ai besoin d'instancier, ou de se moquer, d'une forêt entière.

David Arno
la source
1
Cela ne répond pas à la question car il n'y a pas d'exemple de code ...
Robbie Dee