Orientação a Objetos: Não é o que Você Pensa que É, ou Pelo Menos, Não Era pra Ser
Introdução
"Quando cunhei o termo 'orientado a objetos', vou lhe falar, eu não estava pensando em C++. A grande ideia é 'mensagens'... A chave em criar sistemas bons e expansíveis está muito mais em projetar como seus módulos se comunicam entre si do que como suas propriedades internas e comportamentos devem ser."
"Eu lamento ter cunhado o termo 'objeto' tempos atrás sobre esse assunto, pois isso faz as pessoas focarem na ideia menor. A grande ideia é 'mensagens'."
— Alan Kay, criador da linguagem Smalltalk.
O Paradigma Comum
Quando aprendemos sobre orientação a objetos, a primeira coisa que nos ensinam é a ideia de que objetos no código representam entidades do mundo real, como um carro com atributos como portas e rodas, ou uma televisão que pode ligar e desligar. Contudo, os sistemas reais raramente se parecem com essas analogias simples.
Por exemplo, você frequentemente encontrará objetos como RequisiçãoHTTP ou logMessage, mas dificilmente verá algo como Televisão ou Casa1Joao. E então surge a pergunta: quais comportamentos esses "objetos" devem ter?
As Raízes no Simula
A ideia de usar objetos como representações de entidades do mundo real precede Alan Kay, remontando à linguagem Simula, criada por Ole-Johan Dahl e Kristen Nygaard. Eles estavam projetando uma linguagem para simulações complexas de sistemas reais, como filas de espera, tráfego de redes e processos de manufatura.
Naquela época, a programação procedural mostrava-se inadequada para modelar tais complexidades. As limitações do paradigma procedural impulsionaram Dahl e Nygaard a desenvolver uma nova abordagem, permitindo aos programadores focar no problema em si, em vez de se perder nos detalhes de implementação.
Simula deu o primeiro passo ao introduzir a abstração, organizando o caos do código em pacotes mais claros e definidos. Mas isso ainda não era a POO como conhecemos hoje.
Simula vs. POO Moderna
Você pode estar pensando: "Mas isso não é exatamente a POO moderna?"
Sim e não. Embora Simula tenha introduzido conceitos fundamentais como classes e objetos, a sua implementação era diferente. O foco estava mais na modelagem de eventos e processos específicos, e menos em criar sistemas flexíveis e reutilizáveis.
- Herança: Em Simula, a herança era usada para refinar e especializar procedimentos, sem a complexidade das hierarquias e da flexibilidade que vemos na POO moderna.
- Encapsulamento: Simula não introduziu modificadores de acesso como private, public e protected, que hoje são essenciais para o controle do acesso aos dados e comportamentos dos objetos.
Alan Kay e a Revolução das Mensagens
Alguns anos depois, na Xerox, Alan Kay introduziu uma visão revolucionária para a POO, inspirada em sua formação em biologia. Na mesma Xerox que produziu inovações como a computação gráfica e o Smalltalk, Kay desenvolveu a ideia de que os objetos em um sistema deveriam ser como células em um organismo vivo.
As células funcionam perfeitamente porque se comunicam entre si através de mensagens, cada uma cumprindo sua função específica de acordo com as instruções que recebe. De forma análoga, Kay propôs que objetos em um sistema de software deveriam saber responder a mensagens, independentemente de como essa resposta é implementada.
Esse foco na comunicação e nas mensagens era o cerne da ideia original de Kay para a POO. As interfaces, por exemplo, nada mais são do que o conjunto de mensagens que um objeto pode entender.
Smalltalk: Tudo é Objeto
No Smalltalk, tudo é objeto, inclusive as mensagens. Objetos se comunicam enviando mensagens, que são, por sua vez, objetos. Essa ideia pode parecer um tanto confusa, mas era essencial para criar sistemas altamente flexíveis e expansíveis.
Conectando os Fios
Alan Kay acreditava que o design de sistemas deveria se assemelhar mais à interligação de fios em um circuito do que à organização de arquivos. O importante é garantir que os módulos (ou objetos) estejam conectados de maneira correta e eficiente, e não tanto em como cada módulo é implementado internamente.
Conclusão
A Programação Orientada a Objetos, como foi concebida por Alan Kay, não era apenas sobre organizar código em estruturas que imitam o mundo real, mas sim sobre criar sistemas que se comunicam eficientemente através de mensagens. Embora a POO moderna tenha evoluído a partir das ideias iniciais de Simula e tenha se popularizado com linguagens como C++ e Java, muitas vezes o verdadeiro foco dessa abordagem, que é a comunicação entre objetos, foi diluído.
Compreender a visão original de Kay pode nos levar a reconsiderar como projetamos e construímos software hoje. Em vez de nos concentrarmos apenas na estrutura interna dos objetos e na hierarquia das classes, deveríamos também valorizar a simplicidade e a flexibilidade que uma comunicação bem projetada entre os módulos pode trazer.
Voltar às raízes da POO pode nos ajudar a desenvolver sistemas mais resilientes, modulares e fáceis de expandir. Afinal, como Kay nos lembra, a "grande ideia" não era sobre objetos em si, mas sobre a maneira como eles se comunicam.