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 Banana
objeto requiere que se inicien los objetos Monkey
y Jungle
, por favor?
fuente
Respuestas:
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:
Si lo usa
Banana
, es transitivamente necesario depender también deMonkey
yJungle
.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:
De esta manera, sabes que
Banana
tiene dueño, pero no tiene que ser asíMonkey
. Puede ser cualquier cosa. Y limita lo que puedeBanana
hacer con el propietario a solo operaciones definidas porIBananaOwner
, lo que simplifica el razonamiento.fuente
Monkey
yJungle
son un entorno paraBanana
. Al introducir la abstracción comoIBananaOwner
, el entorno se vuelve explícito. Y cómo se diseña este entorno es de lo que se trata su problema.¡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
getBanana
algún objeto, por ejemplo, una instancia de laGorilla
clase. 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
getBanana
método, necesito crear una instancia o simular un bosque completo.fuente