2. UMA CURTA HISTÓRIA DA POO
“Quando não tínhamos computadores, também não tínhamos problemas de programação.”
Edsger W. Dijkstra
As primeiras bases da Programação Orientada a Objetos (POO) apareceram no início dos anos sessenta, mas não todas de uma vez só. A POO foi o resultado de algumas ideias reunidas a partir das pesquisas realizadas no Massachusetts Institute of Technology (MIT), no Norwegian Computing Center (NR), e outros estudos mais práticos no Xerox Palo Alto Research Center (Xerox PARC), Bell Labs e Sun Microsystems. Cada uma dessas iniciativas serviu para moldar a POO como conhecemos hoje. Os principais marcos tecnológicos que contribuíram para o desenvolvimento do paradigma orientado a objetos são apresentados nos tópicos a seguir.
2.1 LISP: átomos
O termo objeto foi mencionado no MIT como sinônimo de átomo, que é um dos dois tipos de dados disponíveis na linguagem de programação LISP junto com as listas. Os átomos (ou objetos) possuem propriedades (ou atributos) que podem ser outros átomos. A linguagem LISP foi uma ferramenta essencial para a pesquisa no trabalho pioneiro desenvolvido no MIT’s Artificial Intelligence Lab no fim da década de cinquenta e início de sessenta. Ela foi usada para processar dados simbólicos, conforme foi projetada por John McCarthy e implementada por Steve Russel. É importante dizer que o próprio John McCarthy cunhou o termo Inteligência Artificial (IA). LISP desempenhou um papel importante nas origens do conceito de orientação a objetos, pensando em pequenos e inseparáveis pedaços de dados e lógica que contém e processam mais pedaços de dados e lógica.
2.2 Sketchpad: mestre e definição
Os termos objeto e instância também foram mencionados na MIT PhD Thesis de Ivan Sutherland entitulada Sketchpad: A man-machine graphical communications system, onde ele apresentou os resultados do seu trabalho seminal com interfaces gráficas e formas inovadoras de interação, ainda no início dos anos sessenta. Os termos objeto e instância eram usados alternativamente e com o mesmo significado dos termos principais chamados mestre e definição, que eram respectivamente os nomes conceituais dados à ideação de formas geométricas e suas subsequentes cópias concretas. Nos capítulos seguintes, será visto que essas noções de uma ideia abstrata e suas representações concretas estão alinhadas com as noções atuais de classes e instâncias. Dito isso, o Sketchpad de Sutherland foi um passo essencial em direção ao amadurecimento das ideias de orientação a objetos.
2.3 ALGOL: procedimentos + estruturas de dados
A linguagem de programação ALGOL tinha tido várias versões quando, durante seu desenvolvimento nos anos sessenta, houveram os primeiros esforços para juntar a lógica dos procedimentos com os dados do programa, declarando ambos dentro da mesma unidade de código. Essa funcionalidade foi a predecessora da ideia dos métodos dos objetos como conhecemos hoje, que são funções membros das estruturas de dados. ALGOL influenciou várias linguagens de programação subsequentemente, entre elas Pascal e C, mas foi com Simula 67 que a POO deu um salto.
2.4 Simula: classes, subclasses e herança
Simula 67 foi a primeira linguagem de programação a apresentar os conceitos de classe, subclasse, herança e objetos, juntos. Também conhecida como ALGOL com classes, ela foi projetada pelos noruegueses Kristen Nygaard e Ole-Johan Dahl no Norwegian Computing Center (NR). Naturalmente, Simula carecia de alguns conceitos e princípios que só apareceriam anos depois; contudo, ela influenciou várias linguagens de programação modernas, entre elas as populares C++ e Java, servindo de inspiração como declarado pelos seus respectivos criadores Bjarne Stroustrup e James Gosling. Simula foi um marco, podendo-se dizer que houveram as épocas pré e pós-Simula 67 na linha do tempo da POO.
2.5 Smalltalk: troca de mensagens
A segunda onda na evolução do pensamento orientado a objetos veio com a linguagem de programação Smalltalk. Ela foi projetada por Alan Kay, Dan Ingalls e Adele Goldberg nas instalações do Xerox PARC. Seu projeto foi motivado e influenciado principalmente pelos avanços nas interfaces gráficas e suas ideias de objetos virtuais (widgets), que possuíam algumas propriedades e permitiam algumas ações, semelhante ao Sketchpad de Sutherland. Essa motivação foi liderada por Alan Kay, que previu aplicações educacionais dentro de seu projeto específico chamado The Dynabook, que era um dispositivo para crianças muito semelhante ao tablet que conhecemos hoje.
Smalltalk definiu ou solidificou a maioria dos conceitos e princípios da orientação a objetos conhecidos na atualidade, por exemplo, as noções de classe, objeto, estado e a passagem de mensagem e colaboração entre os objetos para cumprir uma meta. Sobre este último, “passagem de mensagem”, Alan Kay declarou como o princípio central da Programação Orientada a Objetos.
A linguagem de programação Smalltalk não teve profunda penetração de mercado ou o mesmo apelo comercial que as outras linguagens concorrentes tiveram no seu tempo. Ainda assim, ela causou uma evolução e revolução ao mesmo tempo, oxigenando ideias e apresentando um novo modelo mental para a organização dos algoritmos dentro dos programas, liderando um movimento que após seria seguido por outros cientistas da computação e engenheiros de software, sejam teóricos ou praticantes.
Finalmente, Alan Kay cunhou o temo “Object-Oriented” (Orientado a Objetos), inspirando-se em todos os avanços tecnológicos anteriores (Sketchpad, Simula), suas ideações e recursos (“sobre o ombro de gigantes”). Para alcançar esse modelo, sendo um Matemático e Biólogo, imaginou os objetos como sendo pequenos computadores em uma rede compartilhada, cada qual com seu estado e recursos, trocando mensagens e, logo, colaborando para concluir uma tarefa. Ele pensou, também, como se os objetos fossem análogos às células biológicas, que se comunicam entre si e juntas formam tecidos, órgãos e por fim o sistema inteiro. Ambas visões são precisas e um modo bem elegante de definir objetos.
2.6 C++: pondo POO no jogo
A primeira linguagem de programação orientada a objetos usada amplamente foi a C++ (C mais mais ou “C plus plus” em inglês). Ela foi projetada e implementada por Bjarne Stroustrup no Bell Labs (laboratórios Bell) no início dos anos oitenta. Inspirado na linguagem Simula, Bjarne construiu a C++ sobre a já conhecida e estabelecida linguagem C5. Talvez este tenha sido o motivo de por que ela foi (e é) bem sucedida. Aproveitando a sintaxe e construtos básicos da linguagem C, C++ foi até chamada inicialmente de “C com classes” por Bjarne, habilitando a maioria dos conceitos conhecidos de POO tais como abstração, herança, polimorfismo e encapsulamento. Ela é usada, por quase quatro décadas, para desenvolver sistemas operacionais, jogos, drivers, firmwares, utilitários de sistema e uma ampla variedade de softwares.
2.7 Java: POO para as massas
No início dos anos noventa, uma equipe trabalhando na Sun Microsystems (hoje Oracle), liderada por James Gosling, estava trabalhando em uma linguagem de programação orientada a objetos que, apesar da inspiração em Smalltalk e C++, fosse mais “versátil”. Seu nome seria Oak (carvalho), depois Greentralk, mas por fim ficou conhecida como Java (em homenagem ao famoso café indonésio produzido na ilha de Java).
Inicialmente, Java foi projetada para ser usada em uma variedade de set-top boxes (tipo um aparelhinho de TV a cabo da época). Assim, ela foi pensada para ser portável, usando a mesma base de código e executando em qualquer dispositivo que tivesse um subsistema conhecido como Java Virtual Machine (JVM), que é responsável por “reproduzir” os programas. Ela foi lançada em 1995 e tornou-se rapidamente a mais influente e popular linguagem de programação orientada a objetos que já existiu devido, oportunamente, ao rápido crescimento da Internet e dos aplicativos web.
Java foi responsável pela difusão do paradigma de POO, sendo consistente com linguagens de modelagem visual, como a Unified Modelling Language (UML), e razoavelmente simples se comparada com suas predecessoras C++ e Smalltalk (mas não com suas sucessoras), sendo que não possui herança múltipla (recurso alegando como sendo uma significante fonte de problemas) e possui gerenciamento automático de memória alocada realizado pelo seu Garbage Collector (coletor de lixo).
Finalmente, Java inspirou muitas outras linguagens de programação modernas no seu “jeito de fazer POO”, como PHP, C#, ECMAScript, Scala, Kotlin e outras. Ela também passou a ser usada em boa parte das instituições educacionais como primeira linguagem e para o ensino de POO. Hoje em dia, Java é usada em aplicativo corporativos de larga escala (plataforma Java EE), além de ser a linguagem primária para o desenvolvimento de aplicativos para smartphones e embarcados na plataforma Android da Google.
2.8 A supremacia Orientada-a-Objetos
Olhando para os índices e histórico de popularidade das linguagens de programação, agora (Dezembro/2020), as orientadas a objetos estão sempre no topo. O PYPL (ver ilustração a seguir) mostra Python, Java, JavaScript, C#, C/C++, PHP, R, Objective C, Swift e Matlab no top ten. Nas posições inferiores, nos índices PYPL e Tiobe, existem outras como Visual Basic.NET, Ruby, TypeScript, Perl, Scala, Kotlin, Golang, onde todas, em maior ou menor escala, suportam o paradigma orientado a objetos.
É essencial mencionar que, mesmo com esse volume de linguagens de programação, elas não tratam a orientação a objetos da mesma maneira. Uma parte considerável delas são class-based (baseadas em classes), isto é, os objetos são criados usando templates (modelos), conhecidos como classes, de onde eles são instanciados. Esse é o caso da Java, PHP, C++, Python e Ruby, por exemplo. Por outro lado, existem as prototype-based (baseadas em protótipos), isto é, as classes não são a estrutura primária e qualquer objeto anteriormente declarado pode servir como protótipo (modelo) para novos objetos. Esse é o caso das linguagens JavaScript, Lua e Self, por exemplo. Ainda, existem linguagens que suportam orientação a objetos, mas que não são estritamente baseadas nem em classes ou protótipos, como Golang.
Apesar da sua fan-base, as linguagens prototype-based não são tão populares quanto as class-based. Mesmo JavaScript, a linguagem prototype-based mais bem sucedida, também oferece construtos na forma de classes, tentando agradar programadores(as) das “duas escolas”.
2.9 Considerações
Os conceitos e princípios da programação orientada a objetos se aplicam mais ou menos do mesmo modo nas linguagens C++, Java, C#, Objective-C, Swift e PHP, entre outras. Eles também são aplicáveis, com algumas adaptações aqui e ali, em JavaScript, Python, Ruby e Golang, por exemplo.
Este livro não é sobre uma linguagem de programação. Em vez disso, a meta é a compreensão e a confiança na implementação dos conceitos e princípios da POO em qualquer que seja a linguagem de programação que os suportem. Em outras palavras, é mais valorizado o pensamento orientado a objetos do que o conhecimento específico sobre sintaxes e bibliotecas disponíveis nas linguagens.
Assim, cada capítulo e tópico seguinte discorrerá sobre conceitos e princípios que podem ser escritos em (quase) qualquer linguagem de programação. Há exemplos de código primariamente em Java e eventualmente podem ser apresentados códigos em outras linguagens, seja no livro ou no repositório. Como última sugestão, se tu não tens muita experiência com qualquer linguagem, escolha uma e use-a para aprender orientação a objetos.
Espero que aprecies a experiência e aprendizado.
2.10 Exercícios
- Dê uma olhada no ranking atual de popularidade das linguagens de programação PYPL e Tiobe nos endereços http://pypl.github.io/PYPL.html e https://www.tiobe.com/tiobe-index/;
- Escolha uma linguagem e procure por empresas e aplicativos que a usam. Considere procurar por vagas de emprego também;
- Visite o site da linguagem escolhida. Por exemplo, aqui está o da linguagem Perl https://www.perl.org/.