Em outro artigo meu, citei como uma linguagem como Java pode ser usada para programação procedural, mesmo sendo “orientada a objeto”. Esses dias, brincando um pouco com Smalltalk, acabei achando um e-mail do Alan Kay sobre o que ele considera “programação orientada a objeto”, e o que isso difere do que conhecemos.
Primeiro ponto: na programação orientada a objetos que a maioria de nós conhecemos, a abstração é mais ou menos assim: um objeto é uma “coisa”, e essa coisa possui métodos. Na hora em que você roda o programa, a “classe” é definida, um ou mais objetos são instanciados, e a partir daí você pode chamar os métodos dos objetos.
Em Smalltalk, as coisas são um pouco diferentes
Primeiro, porque não existe um “roda o programa” por assim dizer. Depois, que Smalltalk foi baseado em “mensagens” – portanto, o conceito mais importante em Smalltalk é a troca de mensagens entre objetos. Mas, para entender isso corretamente, é importante saber como é a linguagem.
A partir do momento em que se inicia, por exemplo, o Squeak (uma das implementações de Smalltalk), tem-se uma tela com diversos “objetos”, ou janelas. É importante esse contexto: uma janela do IDE já é um objeto, e pode receber mensagens e devolver mensagens. Não se imprime no “console” – há um objeto chamado Transcript, que é feito para receber mensagens como “imprima isso”. Não se escreve código-fonte: define-se classes e métodos diretamente no Class Browser. Quando é necessário rodar algo, como por exemplo, subir um servidor web, usa-se o objeto Workspace. E, mais do que Ruby, Smalltalk é completamente orientado a objetos – até mesmo construções como “if” são usadas com objetos, por exemplo:
resultado := a > b ifTrue:[ 'a é maior que b' ] ifFalse:[ 'a é menor ou igual a b' ]
Quebrando um pouco o código, a linha “a > b” envia a mensagem “>” para o objeto “a”, e retorna um Boolean. Então, para este boolean (que pode ser ou “true” ou “false”) envia-se duas mensagens, ambas com um argumento do tipo bloco. ifTrue, roda o bloco se o Boolean for “true”. ifFalse, se for “false”. Dentro de cada bloco, há apenas uma String, que será o retorno ou de ifTrue ou de ifFalse. Esse valor retornado, é atribuído à variável “resultado”.
Na prática, criar uma classe é uma mensagem para a classe Class, diferente de Ruby que definir uma nova classe com a palavra-chave “class” não é a mesma coisa que “Class.new”. Da mesma forma, adicionar um método a uma classe do Smalltalk também é uma mensagem, bem como qualquer coisa que se tente fazer.
O que isso significa, afinal? Significa que em Smalltalk, a abstração é mais semelhante ao mundo real – você possui um “mundo” de classes, cada uma com suas características próprias. O interessante é o fato de que cada classe é praticamente um “processo” sozinho, que se comunica com outras classes ou “processos” usando mensagens. Essa passagem de mensagens, como definiu Alan Kay, é baseada em como as células e neurônios se comunicam um com o outro. Ou seja, em Smalltalk, um objeto não é “simplesmente” uma forma de abstração – é praticamente um organismo por si só. Isso eleva a palavra “orientação a objeto” a um novo nível, um nível que ainda não conseguimos alcançar com nenhuma outra linguagem.
Agora, vale também um pequeno comentário: aprender Smalltalk é praticamente desaprender programação e aprender novamente, de outra maneira. Vale como objeto de estudo, mas eu, particularmente, não acredito que conseguiria desenvolver um grande sistema em Smalltalk.