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.
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.
Uma classe é uma descrição de um conjunto de:
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.
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.
Comportamento | Característica | |
---|---|---|
Classe | Operações | Atributos |
Objeto | Métodos | Variáveis de estado |
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).
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. Oreceptoré o objeto para quem a mensagem está sendo enviada, o qual aceita a responsabilidade de executar a ação. Em resposta a mensagem, oreceptorexecuta 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.
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
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 - comida
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:
comida
, ou seja, cria uma tartaruga
já alimentada com este valor de comida passado; e
comida
.
A visibilidade caracteriza um atributo, ou uma operação, e indica se este atributo, ou operação, pode ser acessível por outras classes. Em Java os três tipos de visibiladade mais comuns estão descritas na tabela abaixo.
Especificação | Símbolo UML | Descrição |
---|---|---|
public |
+ | Pode ser usado por qualquer objeto. |
protected |
# | Pode ser usado por objetos instanciados da classe, ou por sub-classes (através de herança). |
private |
- | Uso exclusivo do próprio objeto. |
comportamentoe de
característicatanto para classe quanto para objeto.
public
e um
qualificador protected
?
(evandro at usp ponto br)