Código de muestra para explicar el problema de Banana Monkey Jungle por Joe Armstrong [cerrado]

14

En el libro Codificadores en el trabajo, Joe Armstrong declaró que:

Creo que la falta de reutilización viene en lenguajes orientados a objetos, no en lenguajes funcionales. Debido a que el problema con los lenguajes orientados a objetos es que tienen todo este entorno implícito que llevan consigo. Querías un plátano, pero lo que obtuviste fue un gorila sosteniendo el plátano y toda la jungla

No lo entiendo bien aquí. Si el problema es obtener un plátano, podemos encapsular toda la lógica detrás de la función 'getBanana'. ¿Cómo se involucran los monos y la jungla en este contexto? ¿Podría alguien escribir un fragmento de código que explique el problema de una manera más fácil de entender, por ejemplo, demostrar el hecho de que el Bananaobjeto requiere que se inicien los objetos Monkeyy Jungle, por favor?

Kha Nguyễn
fuente
ver Discutir esto $ {blog}
mosquito
Lástima que esto se cerró, estaba dando buenos debates. Mire las funciones de primera clase como iniciador.
Robbie Dee
1
Las preguntas del tipo @Euphoric Discussion están realmente permitidas, pero las preguntas que son subjetivas podrían ser ... subjetivas.
Robbie Dee
2
Creo que esta entrevista se realizó antes de que Joe Armstrong escribiera su tesis doctoral. Mientras escribía su tesis doctoral, Armstrong aprendió sobre la definición real de OO, y se dio cuenta de que Erlang en realidad está completamente orientado a objetos, de hecho, de todos los lenguajes principales actuales, ¡Erlang es probablemente el lenguaje más orientado a objetos! No habría hecho esa declaración de esa manera si hubiera sabido que Erlang era en realidad un lenguaje OO. De lo que está hablando es de la autoridad ambiental , que tiene absolutamente todo lo que ver con OO.
Jörg W Mittag
1
Hola, mi pregunta es sobre proporcionar un código de muestra que me ayude (y a otros) a comprender mejor el problema. Cualquier fragmento de código que demuestre el problema es aceptable, no solo la opinión.
Kha Nguyễn

Respuestas:

16

Está insinuando un hecho, que la mayoría de los programas reales de OOP no respetan la separación de las preocupaciones. Por ejemplo, podrías tener clases:

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

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

public class Jungle
{
}

Si lo usa Banana, es transitivamente necesario depender también de Monkeyy Jungle.

Pero estoy estrictamente en desacuerdo con que este es un problema con OOP y que el estilo funcional de alguna manera no lo tiene. Esto se puede solucionar fácilmente en OOP con la introducción de la abstracción correcta.

El problema es más sobre los desarrolladores que no se preocupan por la separación de las preocupaciones. Y no tendría miedo de afirmar que la mayoría de los programadores de OOP son novatos, mientras que los programadores funcionales tienen cierta experiencia, que los motiva a separar adecuadamente su código.

La posible abstracción podría ser:

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

public interface IBananaOwner
{
}

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

public class Jungle
{
}

De esta manera, sabes que Bananatiene dueño, pero no tiene que ser así Monkey. Puede ser cualquier cosa. Y limita lo que puede Bananahacer con el propietario a solo operaciones definidas por IBananaOwner, lo que simplifica el razonamiento.

Eufórico
fuente
Y, a la inversa, si bien los lenguajes funcionales admiten funciones de primera clase listas para usar, es decir, la función X puede ser consumida de manera segura por la función Y sin efectos secundarios.
Robbie Dee
Aunque haces un excelente comentario, creo que puedes estar yendo un poco fuera de pista aquí. La cita menciona explícitamente el entorno, no cómo se ha diseñado el código.
Robbie Dee
@RobbieDee The Monkeyy Jungleson un entorno para Banana. Al introducir la abstracción como IBananaOwner, el entorno se vuelve explícito. Y cómo se diseña este entorno es de lo que se trata su problema.
Eufórico el
Puede que tengas razón, pero no puedo evitar pensar que al leer esto, entre otras cosas, que el elefante en la habitación (para agregar otro animal) es que el problema está en la composición correcta de las funciones que históricamente tiene la programación funcional. se prestó a más.
Robbie Dee
@RobbieDee No puede reemplazar lo que escribí con una composición de funciones simple. Al menos no fuera de los problemas de los ejemplos de juguetes. En la práctica, para reemplazar completamente el diseño de OOP, se necesitan cosas como genéricos complejos, clases de tipos, mónadas y otros. Y eso solo está cambiando un tipo de complejidad por otro tipo.
Eufórico el
13

¡Los gorilas no son monos!

Dejando eso de lado, usted responde su propia pregunta con " podemos encapsular toda la lógica detrás de la función 'getBanana' ". Todo lo que quiero es un plátano, pero para obtenerlo necesito invocar getBananaalgún objeto, por ejemplo, una instancia de la Gorillaclase. Ese objeto de plátano probablemente contenga una referencia al gorila al que pertenece y ese objeto del gorila a su vez tendrá una referencia al bosque al que pertenece. Entonces pido un plátano, pero encapsulado detrás de eso está toda la jungla.

Es un ejemplo extremo y no siempre será tan malo. Pero no es raro terminar con un sistema OO como este. Y así, para probar ese getBananamétodo, necesito crear una instancia o simular un bosque completo.

David Arno
fuente
1
Esto no responde a la pregunta ya que no tiene código de muestra ...
Robbie Dee