Uma breve introdução a classes e objetos

Se observarmos nosso meio, podemos chamar de objetos quase tudo o que nos cerca. Até mesmo muitas das tarefas e ações que fazemos são executadas sobre objetos ou, são tarefas que se relacionam a objetos.

Carros, livros, copos, roupas, dinheiro... por vezes os objetos são compostos por outros objetos... Nós humanos pensamos e lidamos com objetos naturalmente.
Para quase todos objetos podemos atribuir, ou reconhecer características, tais como: cor, tamanho, forma etc. Para outros objetos podemos inclusive atribuir comportamentos, ou funções, como locomoção, alimentação entre outras várias.

Perceba que, de um ponto de vista racional e organizacional, até mesmo uma instituição ou uma empresa, pode ser vista como um conjunto de objetos (pessoas e máquinas) que trabalham com certas atribuições, são responsáveis sobre certas tarefas e atitudes e que, se observados num dado instante, também possuem características, ou aqui chamadas, variáveis de estado, como por exemplo, em férias, ocupado, ocioso, em manutenção, entre outros.

Esta visão sistematizada de universo foi adotada pela comunidade de Computação para se criar uma abordagem de desenvolvimento de software, a Orientação a Objetos -- OO. Nesta abordagem trabalhamos com uma programação em que os objetos, junto com seus estados e suas ações, são os atores principais. Convém mencionar que a orientação a objetos não é usada somente para o desenvolvimeto de software mas também na análise de sistemas, em projetos de sistemas, ou mais genericamente, em toda a Engenharia de Software.

Classes e objetos

Usando a abordagem educacional de entendimento de conceitos por exemplos, vamos imaginar que estamos diante de um monitor de computador (ou, se preferir, de um console de vídeo game) que mostre, por exemplo, uma tartaruga numa determinada ação, correndo, ou melhor para este animal, vagarosamente se locomovendo. Obviamente que esta deve ser uma tartaruga virtual. Vamos chamá-la de um objeto virtual, algo que foi programado, ou seja, descrito através de um software que anima e propicia aparência (cor, forma e movimento) a este objeto, a esta tartaruga virtual.

Com base no descrito acima e, considerando que o programador usou a abordagem de orientação a objetos no desenvolvimento do seu programa, este programador descreveu em software os estados (as características) e comportamentos (as tarefas) possíveis de uma tartaruga virtual. Ele escreveu uma receita, um modus operandi de como uma tartaruga se comporta e se apresenta num computador.
Na abordagem OO dizemos que ele escreveu uma classe.

Classe

Uma classe é uma descrição de um conjunto de:

Objeto

Já um objeto é uma realização desta classe. Em OO dizemos que um objeto é uma instanciação de uma classe.

Voltando ao caso de nossa tartatura. Uma vez escrita uma classe, podemos criar vários objetos, instâncias da classe tartaruga, que podem ter as características descritas na classe. Num dado instante porém, nem todos os objetos do tipo tartaruga necessariamente apresentam os mesmos estados, ou seja, as mesmas características, e nem tampouco precisam estar desempenhando as mesmas tarefas que os outros objetos instanciados desta classe.

Nomenclatura

Vamos agora reorganizar e padronizar neste texto alguns vocábulos já utilizados:

Atributos: Classes e objetos podem ter características como cor, tamanho e idade. Estas características são conhecidas como atributos de uma classe. Quando ocorre uma instanciação, ou seja, a criação de um objeto a partir desta classe, dizemos que este atributo é uma variável de estado, uma propriedade do objeto criado;
Comportamento: Classes e objetos também podem ter comportamento definido. Este comportamento, quando descrito nas classes, tem o nome de operação, e nos objetos é chamado de método:. Em OO as chamadas para estas operações são conhecidas como mensagens. Então, quando um objeto A chama, ou melhor, demanda uma operação de um outro objeto B, dizemos que A mandou uma mensagem para B. Logo, o funcionamento de um código OO é na realidade composto de troca de mensagens entre objetos.

Fazendo um paralelo com a programação procedural, que é a programação orientada a ações, em que o foco da programação está nos procedimentos, nas funções e na modularização destas chamadas, na programação orientada a objetos (POO) o foco está nos objetos.
Enquanto na programação procedural escrevem-se funções e procedimentos, na POO criam-se tipos definidos pelo usuário, ou seja, classes.

A Tabela abaixo abaixo sintetiza a nomenclatura adotada neste texto.

Nomenclatura adotada no texto.
  Comportamento Característica
Classe Operações Atributos
Objeto Métodos Variáveis de estado

Outra característica importante da POO é o encapsulamento de características e comportamentos, como veremos abaixo.

Encapsulamento

O encapsulamento é uma das fortes características da programação orientada a objetos.

O encapsulamento é a restrição do conhecimento, por um objeto, do modo como características e comportamento de outro objeto foram implementadas.
Esta restrição é feita ao objeto chamador e aos usuários deste objeto, ou seja, quem usa o objeto não sabe como ele foi implementado, somente conhece suas reação a mensagens enviadas (as chamadas de métodos).

Mensagens

Para os usuários, os objetos são como caixas pretas as quais o usuário usa mas não conhece o seu funcionamento interno.
Nesta situação, um objeto somente faz contato com outro objeto por meio de passagem de mensagens. Esta é a forma de interação entre objetos: mensagens. No entanto, para que um objeto possa interagir com outro é necessário conhecer qual é sua interface, ou seja, quais são as mensagens que ele aceita.

As mensagens enviadas para um objeto podem ser de dois tipos:

Como diz Timothy Budd:

As ações em POO são realizadas através da transmissão de mensagens para objetos responsáveis por estas ações. As mensagens codificam uma requisição que é acompanhada por informação adicional (argumentos) necessária para a completude desta requisição. O receptor é o objeto para quem a mensagem está sendo enviada, o qual aceita a responsabilidade de executar a ação. Em resposta a mensagem, o receptor executa o método correspondente.

A grande virtude do encapsulamento é dar liberdade de programação ao programador para decidir como deve ser a implementação do objeto.
O encapsulamento também facilita a organização do trabalho e da programação de outros objetos, já que estes objetos só precisariam conhecer a interface que utilizarão para a comunicação com o objeto desejado.

Perceba que, com este conceito de encapsulamento, um objeto não precisa conhecer como outros objetos funcionam internamente, ele envia uma mensagem respeitanto a definição da interface e espera por uma resposta, uma ação do objeto chamados. Simples, não?!

Veja como esta noção de objeto virtual é próxima ao conceito dos objetos reais no que diz respeito ao encapsulamento. Suponha, por exemplo, um correio postal ou mesmo um programa de correio eletrônico. O usuário manda uma mensagem endereçada e ela chega ao destinatário. Como isso ocorre?! Os detalhes podem não interessar para muitos usuários, eles estão encapsulados. O usuário, no entanto, precisa conhecer a interface, ou seja, como acessar o serviço de mensagens e, pronto! Mandar a mensagem.
Notem que com a maioria dos equipamentos eletrônicos, como também os automóveis, as repartições públicas e privadas, quase tudo, funciona como se fosse um objeto. Na abordagem orientação a objetos um objeto delega obrigações a outro. Tudo é feito através de mensagens.

Visibilidade

Note também que as interfaces dos objetos tem que ter visibilidade pública, ou seja, todo o objeto deve saber como mandar mensagens para outro objeto.

Veremos logo adiante que os qualificadores public, protected e private definem hierarquias de acesso tanto para as características quanto para o comportamento, ou seja, os objetos podem ter qualificadores que especificam as características de acessibilidade para as variáveis de estado e para os métodos.

Vamos agora fazer uma pausa para um exemplo diagramático com nossa tartaruga virtual. Vejamos a figura a seguir:

Na figura acima vemos um diagrama da classe Tartaruga escrito em UML. UML significa Unified Modeling Language e é uma linguagem padrão para descrição de sistemas orientados a objetos. Entende-se aqui sistemas como sistemas computacionais.

Neste diagrama vemos o nome da classe, Tartaruga, seguido de dois blocos abaixo deste. No primeiro bloco descrevemos os atributos da classe e no bloco abaixo o comportamento, as ações possíveis nesta classe.

Note que o atributo - comida está precedido de um sinal negativo que indica que esta variável é privada desta classe. Em muitas linguagens orientadas a objetos codificamos este qualificador pelo termo private. Já a operação comFome() é uma operação public, ou seja, aberta a todas as outras classes. Daí a razão do sinal positivo que a precede. Esta pode ser uma operação que responde, usando valores lógicos, se o objeto está ou não faminto.

No bloco de comportamento estão indicadas duas outras operações que recebem o nome especial de operações construtoras. São estas operações que constroem, que realizam, ai ainda, que efetivam os objetos, ou técnicamente, que instanciam o objeto, a partir de uma classe.
Neste diagrama são dois os construtores possíveis: