Código de exemplo para explicar o problema da Banana Monkey Jungle por Joe Armstrong [fechado]

14

No livro Coders at work, Joe Armstrong afirmou que:

Eu acho que a falta de reutilização vem nas linguagens orientadas a objetos, não nas linguagens funcionais. Como o problema das linguagens orientadas a objetos é que elas têm todo esse ambiente implícito que carregam consigo. Você queria uma banana, mas o que você conseguiu foi um gorila segurando a banana e toda a selva

Eu não entendo bem aqui. Se o problema é obter uma banana, podemos encapsular toda a lógica por trás da função 'getBanana'. Como o macaco e a selva estão envolvidos nesse contexto? Alguém poderia escrever um trecho de código que explica o problema em um mais fácil de entender, por exemplo, demonstrar o fato de que o Bananaobjeto requer o Monkeye Jungleobjetos para ser iniciado, por favor?

Kha Nguyễn
fonte
consulte Discutir este $ {blog}
gnat
Pena que isso foi encerrado - estava gerando boas discussões. Observe as funções de primeira classe como iniciantes.
Robbie Dee #
1
As perguntas do tipo Discussão eufórica são realmente permitidas, mas quais perguntas são subjetivas podem ser ... subjetivas.
Robbie Dee
2
Acredito que essa entrevista foi realizada antes de Joe Armstrong escrever sua tese de doutorado. Enquanto escrevia sua tese de doutorado, Armstrong aprendeu sobre a definição real de OO e percebeu que Erlang é realmente completamente orientado a objetos, de fato, de todas as linguagens mainstream atuais, Erlang é provavelmente a linguagem mais orientada a objetos! Ele não teria feito essa afirmação dessa maneira se soubesse que Erlang era na verdade uma linguagem OO. O que ele está falando é a autoridade ambiental , que tem absolutamente a ver com o OO.
Jörg W Mittag 04/04
1
Olá, minha pergunta é sobre fornecer um código de exemplo que me ajude (e a outros) a entender melhor o problema. Qualquer trecho de código que demonstre o problema é aceitável, não apenas uma opinião.
Kha Nguyễn

Respostas:

16

Ele está sugerindo que a maioria dos programas reais de POO não respeita a separação de preocupações. Por exemplo, você poderia ter classes:

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

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

public class Jungle
{
}

Se você usar Banana, é temporariamente necessário também depender de Monkeye Jungle.

Mas eu discordo totalmente que isso é um problema com OOP e que o estilo funcional de alguma forma não o possui. Isso pode ser facilmente corrigido no OOP com a introdução da abstração correta.

O problema é mais sobre os desenvolvedores que não se preocupam com a separação de preocupações. E eu não teria medo de afirmar que a maioria dos programadores de POO são iniciantes, enquanto os programadores funcionais têm alguma experiência que os motiva a separar adequadamente seu código.

A abstração possível pode ser:

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

public interface IBananaOwner
{
}

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

public class Jungle
{
}

Dessa forma, você sabe que Bananatem dono, mas não precisa ser Monkey. Pode ser qualquer coisa. E limita o que pode ser Bananafeito com o proprietário apenas às operações definidas por IBananaOwner, o que simplifica o raciocínio.

Eufórico
fonte
E, por outro lado, enquanto as linguagens funcionais suportam funções de primeira classe prontas para uso - isso não significa que a função X possa ser consumida com segurança pela função Y sem efeitos colaterais.
Robbie Dee #
Embora você faça uma excelente observação, acho que você pode estar um pouco fora de pista aqui. A citação explicitamente menciona o ambiente, não como o código foi projetado.
Robbie Dee #
@RobbieDee O Monkeye Jungleé um ambiente para Banana. Ao introduzir abstração como IBananaOwner, o ambiente se torna explícito. E como esse ambiente é projetado é o problema dele.
eufórico
Você pode estar certo, mas não posso deixar de pensar que, depois de ler isso entre outras coisas, o elefante na sala (para adicionar outro animal) é que o problema está na composição correta das funções que a programação funcional, historicamente, tem prestou-se a mais.
Robbie Dee #
@RobbieDee Você não pode substituir o que escrevi pela composição simples de funções. Pelo menos não fora dos problemas de exemplo de brinquedos. Na prática, para substituir completamente o design de POO, coisas como genéricos complexos, classes de tipos, mônadas e outras são necessárias. E isso está apenas mudando um tipo de complexidade para outro.
eufórico
13

Gorilas não são macacos!

Deixando isso de lado, você responde sua própria pergunta com " podemos encapsular toda a lógica por trás da função 'getBanana' ". Tudo o que eu quero é uma banana, mas para obtê-la eu preciso chamar getBananaalgum objeto, por exemplo, uma instância da Gorillaclasse. Esse objeto de banana provavelmente contém uma referência ao gorila ao qual pertence e esse objeto, por sua vez, terá uma referência à floresta à qual pertence. Por isso, peço uma banana, mas encapsulada por trás, está toda a selva.

É um exemplo extremo e nem sempre será tão ruim assim. Mas não é incomum acabar com um sistema OO como este. E assim, para testar esse getBananamétodo, preciso instanciar ou zombar de uma floresta inteira.

David Arno
fonte
1
Isso não responder à pergunta, uma vez que não tem código de exemplo ...
Robbie Dee