Smalltalk, e a noção de objetos

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.

Advertisements
This entry was posted in Smalltalk and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s