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 Banana
objeto requer o Monkey
e Jungle
objetos para ser iniciado, por favor?
fonte
Respostas:
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:
Se você usar
Banana
, é temporariamente necessário também depender deMonkey
eJungle
.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:
Dessa forma, você sabe que
Banana
tem dono, mas não precisa serMonkey
. Pode ser qualquer coisa. E limita o que pode serBanana
feito com o proprietário apenas às operações definidas porIBananaOwner
, o que simplifica o raciocínio.fonte
Monkey
eJungle
é um ambiente paraBanana
. Ao introduzir abstração comoIBananaOwner
, o ambiente se torna explícito. E como esse ambiente é projetado é o problema dele.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
getBanana
algum objeto, por exemplo, uma instância daGorilla
classe. 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
getBanana
método, preciso instanciar ou zombar de uma floresta inteira.fonte