Entendendo a Orientação a Objetos com Smalltalk
Introdução
A orientação a objetos é um paradigma de programação que representa conceitos do mundo real como "objetos" com "atributos" e "comportamentos". Smalltalk é uma das linguagens de programação mais puras em termos de orientação a objetos e foi fundamental no desenvolvimento deste paradigma. Neste post, vamos explorar os conceitos de orientação a objetos através do Smalltalk e fornecer exemplos práticos.
Conceitos Básicos
Em Smalltalk, tudo é um objeto, desde os números e strings até as estruturas de controle e as próprias classes. Cada objeto é uma instância de uma classe, que define os atributos (variáveis de instância) e comportamentos (métodos) do objeto.
Classes e Objetos
Uma classe em Smalltalk é um modelo para criar objetos. Por exemplo, você pode ter uma classe Carro
que tem atributos como cor
e modelo
, e comportamentos como acelerar
e frear
.
Exemplo:
Carro class
instanceVariableNames: 'cor modelo velocidade'
Carro methods
acelerar
velocidade := velocidade + 10.
frear
velocidade := velocidade - 10.
Definição da Classe Carro:Carro class
: Isso indica que estamos definindo uma nova classe chamadaCarro
.instanceVariableNames: 'cor modelo velocidade'
: Aqui, estamos declarando que cada instância da classeCarro
terá três variáveis de instância chamadascor
,modelo
evelocidade
. Variáveis de instância são atributos que pertencem a cada objeto individual criado a partir da classe.- Definição dos Métodos da Classe Carro:
Carro methods
: Esta linha indica que estamos começando a definir métodos que pertencem à classeCarro
. - Método acelerar:
acelerar
: Este é o nome do método que, quando invocado em um objeto da classeCarro
, irá executar o código dentro do método.velocidade := velocidade + 10
: O operador:=
é usado para atribuição em Smalltalk. Este comando aumenta o valor da variável de instânciavelocidade
em 10 unidades. É o equivalente a dizer "aumente a velocidade do carro em 10". - Método frear:
frear
: Este é outro método definido para a classeCarro
.velocidade := velocidade - 10
: Semelhante ao métodoacelerar
, este comando diminui o valor da variável de instânciavelocidade
em 10 unidades, ou seja, reduz a velocidade do carro em 10.
Herança
A herança permite que uma classe herde atributos e comportamentos de outra. Por exemplo, uma classe Caminhao
pode herdar da classe Carro
e adicionar seus próprios comportamentos específicos.
Exemplo:
Caminhao subclass: Carro
instanceVariableNames: 'capacidadeDeCarga'
Caminhao methods
carregar: umaQuantidade
capacidadeDeCarga := capacidadeDeCarga + umaQuantidade.
- Definição da Subclasse Caminhao:
Caminhao subclass: Carro
: Isso cria uma nova classe chamadaCaminhao
que herda características da classeCarro
. Isso significa queCaminhao
terá todas as variáveis de instância e métodos deCarro
, além de suas próprias definições específicas.instanceVariableNames: 'capacidadeDeCarga'
: Aqui, estamos declarando que a classeCaminhao
terá uma variável de instância adicional chamadacapacidadeDeCarga
, que é específica para objetosCaminhao
e não está presente na classeCarro
.
- Definição dos Métodos da Classe Caminhao:
Caminhao methods
: Esta linha indica que estamos começando a definir métodos que pertencem à classeCaminhao
.
- Método carregar:
carregar: umaQuantidade
: Este é o nome do método que aceita um argumento chamadoumaQuantidade
. Quando invocado, este método irá executar o código dentro do bloco do método.capacidadeDeCarga := capacidadeDeCarga + umaQuantidade
: O operador:=
é usado para atribuição em Smalltalk. Este comando aumenta o valor da variável de instânciacapacidadeDeCarga
pela quantidade especificada no argumentoumaQuantidade
. Isso representa o ato de carregar o caminhão com uma certa quantidade de carga.
Mensagens
Em Smalltalk, a interação entre objetos ocorre através do envio de mensagens. Quando você quer que um objeto execute um de seus métodos, você envia uma mensagem para ele.
Exemplo:
meuCarro := Carro new.
meuCarro cor: 'Vermelho'.
meuCarro modelo: 'Fusca'.
meuCarro acelerar.
Polimorfismo:
O polimorfismo é a capacidade de tratar objetos de diferentes classes através da mesma interface. Em Smalltalk, isso é natural, pois a linguagem depende do envio de mensagens para a comunicação entre objetos.
Exemplo:
veiculos := List with: meuCarro with: meuCaminhao.
veiculos do: [:veiculo | veiculo acelerar].
- Criação da Lista de Veículos:
veiculos := List with: meuCarro with: meuCaminhao.
: Esta linha cria uma nova lista chamadaveiculos
e inicializa-a com dois objetos:meuCarro
emeuCaminhao
. O métodowith:with:
é uma maneira de criar uma lista contendo os itens fornecidos como argumentos.
- Iteração Sobre a Lista de Veículos:
veiculos do: [:veiculo | veiculo acelerar].
: Esta linha é onde a iteração acontece. O métododo:
é usado para iterar sobre cada elemento da listaveiculos
. Para cada elemento (referido aqui comoveiculo
), o bloco de código entre colchetes é executado.[:veiculo | veiculo acelerar]
: Este é um bloco (uma função anônima ou lambda em outros idiomas) que recebe um argumento chamadoveiculo
. Para cadaveiculo
na listaveiculos
, o métodoacelerar
é chamado.veiculo acelerar
: Este é o comando dentro do bloco que é executado para cada veículo. Ele envia a mensagemacelerar
para o objetoveiculo
, o que significa que o métodoacelerar
definido na classe do objetoveiculo
será invocado. Seveiculo
for umCarro
, ele aumentará suavelocidade
em 10. Se for umCaminhao
, assumindo queCaminhao
não sobrescreveu o métodoacelerar
, ele também aumentará suavelocidade
em 10.
Encapsulamento
O encapsulamento é o conceito de esconder os detalhes internos de um objeto e expor apenas o que é necessário para o uso externo. Em Smalltalk, isso é feito definindo métodos de acesso para as variáveis de instância.
Exemplo:
Carro methods
cor: umaCor
cor := umaCor.
cor
^cor
Smalltalk é uma excelente linguagem para aprender os conceitos de orientação a objetos devido à sua simplicidade e consistência. Tudo em Smalltalk é um objeto, e a interação entre objetos é feita de maneira uniforme através do envio de mensagens. Isso torna Smalltalk uma ferramenta poderosa para entender profundamente a orientação a objetos e para modelar problemas complexos de maneira intuitiva.
Se você está interessado em aprofundar seus conhecimentos em orientação a objetos, considere explorar Smalltalk. A simplicidade e pureza da linguagem podem oferecer insights valiosos e melhorar sua habilidade de pensar em termos de objetos e suas interações.
Referências
