Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação Orientada A Objetos
Programação Orientada A Objetos
Tutorial POO
Tutorial POO
1ª Edição
Criado em fevereiro de 2007.
Considerações Iniciais
Já vi algumas pessoas tentarem se aventurar em programação, mas sem obter sucesso. Qual a
causa disso? O desenvolvimento de sistemas é uma tarefa bastante complexa. Além disso,
muitas pessoas inexperientes na programação não conhecem os conceitos básicos de orientação
a objetos.
Este será o foco deste tutorial. Demonstrar os conceitos da programação orientada a objetos e
dar sugestões de como programar melhor, ou seja, as boas práticas de programação.
Este tutorial foi revisado extensivamente, mas, apesar disso, podem ocorrer erros. Por favor me
avisem caso encontrem algum.
Como já é de praxe, gostaria de lembrar que não estou aqui querendo afirmar nada sobre nada
nem ninguém. Não quero ofender nenhum leitor, ou o vizinho, ou o cachorro do vizinho, ou o
papagaio de qualquer um que seja. Não estou tentando provar nada. Não sou “guru” da
programação. Portanto, tenham paciência...
E me desculpem por qualquer tipo de transtorno e muito obrigado aos que me ajudaram e
incentivaram.
Cavaco's Creations
Você pode copiar, distribuir, exibir, executar ou criar obras derivadas sob as seguintes condições:
Atribuição: Você deve dar crédito ao autor original, da forma especificada pelo
autor ou licenciante.
Uso Não-Comercial: Você não pode utilizar esta obra com finalidades comerciais.
Para cada novo uso ou distribuição, você deve deixar claro os termos da licença desta obra.
Qualquer uma destas condições podem ser renunciadas, desde que você obtenha permissão do
autor. Qualquer direito de uso legítimo (ou "fair use") concedido por lei, ou qualquer outro direito
protegido pela legislação local, não são em hipótese alguma afetados pelo disposto acima.
Este é um sumário para leigos da Licença Jurídica (que pode ser obtida na íntegra em
http://www.4shared.com/file/11081399/19b3184f/Licena_de_Uso.html).
Esta Licença Simplificada não é uma licença propriamente dita. Ela é apenas uma referência útil
para entender a Licença Jurídica (a licença integral). Ela é uma expressão dos seus termos-chave
que pode ser compreendida por qualquer pessoa. A Licença Simplificada em si não tem valor
legal e seu conteúdo não aparece na licença integral. A Cavaco's Creations não é um escritório de
advocacia e não presta serviços jurídicos. A distribuição, exibição ou inclusão de links para esta
Licença Simplificada não estabelece qualquer relação advocatícia.
Agradecimentos
Agradeço à:
Sumário
Tutorial POO............................................................................. 1
Considerações Iniciais................................................................ 2
Cavaco's Creations..................................................................... 3
Agradecimentos......................................................................... 4
Sumário................................................................................... 5
Índice de Ilustrações.................................................................. 7
Como Utilizar este Tutorial.......................................................... 8
Começando............................................................................... 9
Programação Orientada a Objetos.............................................. 11
O que é Programação Orientada a Objetos? ..............................................11
E o que são Objetos?..............................................................................12
Mas, afinal, qual é a diferença entre Classe e Objeto?................................. 13
Conceitos Básicos de POO....................................................................... 14
Abstração.............................................................................................................. 15
Encapsulamento...................................................................................................... 15
Proteção da informação (information/data hiding) ....................................................... 17
Sobreposição (Overriding)........................................................................................ 19
Passagem de mensagens (parâmetros)...................................................................... 20
Delegação ............................................................................................................. 20
Classes/objetos/instâncias........................................................................................ 21
Herança (Generalização/Especialização) .................................................................... 21
Polimorfismo ......................................................................................................... 23
Relacionamentos..................................................................................................... 23
Uma palavra de cautela ......................................................................... 24
Programar Orientado a Objetos é modelar ................................................24
Criando Objetos....................................................................... 25
Identificação de substantivos ..................................................................25
Identificação das classes.........................................................................27
Conclusão............................................................................... 48
Índice de Ilustrações
Figura 1: Diferença entre Classes e Objetos...................................................................................... 13
Figura 2: Programação Convencional................................................................................................ 15
Figura 3: Representação de uma classe/objeto.................................................................................. 15
Figura 4: Exemplo de Objeto........................................................................................................... 16
Figura 5: Objeto lâmpada............................................................................................................... 16
Figura 6: Data hiding..................................................................................................................... 17
Figura 7: Analogia com um Iceberg.................................................................................................. 18
Figura 8: Passagem de mensagens.................................................................................................. 20
Figura 9: Exemplo de Herança........................................................................................................ 21
Figura 10: Outro exemplo de Herança.............................................................................................. 21
Figura 11: Definição de Herança...................................................................................................... 21
Figura 12: Exemplo de uma Classe.................................................................................................. 28
Figura 13: Exemplo detalhado de uma Classe.................................................................................... 28
Este tutorial é de nível básico. A leitura deste tutorial é aconselhável para todos os leigos no
universos de desenvolvimento de sistemas e programação.
Existem diversos modelos de desenvolvimento de sistemas, mas o modelo que mais utilizado
atualmente é a orientação a objetos. Portanto, veremos como chegar no âmago deste
paradigma.
Este tutorial deve ser compreendido antes de qualquer aprofundamento em qualquer linguagem
orientada a objeto (Java, C, dentre outros, incluindo o Ruby). Principalmente se você se
considera leigo no assunto. Agora, vamos deixar de “enrolar” e partir pro que interessa.
Começando
A programação orientada a objetos (POO) é um paradigma de programação que tenta aproximar
o código fonte da realidade. Antigamente, o que existia era o paradigma procedural, ou seja,
procedimentos seqüenciais. Este paradigma antigo distanciava a programação do mundo real,
pois uma seqüência lógica de procedimentos não se mostrava realista o suficiente.
No mundo real o que existem são objetos. Exemplo: Um copo! Para que serve este objeto? Ele
pode ser enchido com algum líqüido, ou esvaziado, além de possuir um volume máximo, etc. Na
programação orientada a objetos (POO) o Copo é uma classe, a ação de Encher o Copo e
Esvaziar o Copo são dois métodos que fazem duas coisas distintas e Volume Máximo é um
atributo. Este é o fator que diferencia a programação orientada a objetos (POO) de outros
paradigmas.
Por causa deste diferencial, a programação orientada a objetos (POO) se aproxima mais do
mundo como nós realmente o vemos.
As classes e objetos são uma forma de TAD que é muito utilizado atualmente, mas... O que leva
um programador a mudar do paradigma procedimental para um novo?
A resposta esta na complexidade crescente dos sistemas e nas limitações da capacidade humana
de compreensão de um sistema como um todo. Um sistema fica complexo quando se usa um
conjunto grande de tarefas e diversos de comportamentos tendo um longo ciclo de vida e muitos
usuários dependendo dele. A complexidade está na quantidade e diversidade.
Tudo o que vemos à nossa volta são objetos. Estamos acostumados a ver objetos (classes) e
saber imediatamente para que eles servem (seus métodos) e quais as suas características
(atributos). Por causa disso fica muito mais fácil compreender o sistema como um todo quando
se usa a POO.
Curiosidade:
Além disso, os paradigmas (na ciência da computação) explicam como os elementos que
compõem um programa são organizados e como interagem entre si.
10
Como nós já sabemos, no mundo real, tudo é objeto! Estes objetos se relacionam entre si de
diversas maneiras. Exemplo: Copo e Garrafa. O objeto garrafa tem os mesmos métodos e
atributos do copo, mas com valores diferente. Quando se esvazia a garrafa pode-se estar
enchendo o copo (se o copo não estiver cheio). Esta iteração entre os objetos é muito freqüente
na POO. Um programa orientado a objetos é estruturado como uma comunidade de agentes que
interagem entre si. Os agentes são os denominados objetos. Cada objeto tem um papel a
cumprir e oferece um serviço ou realiza uma ação que é usada por outros membros da
comunidade, ou seja, outros objetos (o copo e a garrafa).
11
Um objeto é uma variável... Ele armazena dados. Então uma estrutura de variáveis é um objeto,
mas um objeto pode ser mais que uma estrutura de variáveis: você pode pedir que determinadas
operações sejam feitas sobre os objetos e suas variáveis.
Um programa é um conjunto de objetos dizendo uns para os outros o que fazer através do envio
de mensagens. Concretamente, pode-se pensar nas mensagens como sendo chamadas a funções
que pertencem a um objeto em particular.
Cada objeto tem a sua própria região de memória, que pode ser composta por outros objetos,
também. Exemplo: o objeto carro pode ser composto pelos objetos lataria, rodas, motor, dentre
outros.
12
Classes e objetos são praticamente a mesma coisa, com algumas pequenas diferenças. As classe
e objetos possuem uma combinação de dados e operações em um elemento único. A diferença
mais visível é a seguinte:
a) placa-mãe;
b) CPU;
c) placa de vídeo;
d) disco rígido;
e) teclado, etc.
13
Cada componente é bastante sofisticado, mas o usuário não precisa saber como funciona
internamente, pois cada componente é independente dos demais. Para quem está montando um
computador, interessa apenas como os componentes interagem entre si, ou seja:
É exatamente isso que fazemos ao utilizar classes (objetos). Nós sabemos que elas existem e
como interagem, então usamos elas de forma lógica e intuitiva.
Agora vamos nos aprofundar na POO um pouco mais conhecendo alguns dos princípios da
Orientação a Objetos. Os principais são:
a) Abstração;
b) Encapsulamento;
c) Proteção/ocultação da informação (information/data hiding);
d) Sobreposição (Overriding);
e) Passagem de mensagens;
f) Delegação;
g) Classes/objetos/instâncias;
h) Herança;
i) Polimorfismo;
j) Relacionamentos.
14
Abstração
Abstração, nada mais é do que um conceito de POO que diz o seguinte: Devemos representar
numa entidade apenas os atributos mais importantes para um contexto particular. A abstração de
sub-programas permitem especificar O QUE deve ser feito, sem detalhar COMO.
Encapsulamento
Dados Procedimentos
Figura 2: Programação Convencional.
Nos objetos a iteração é maior e contém tanto os dados quanto a descrição das operações que
manipularão ou alterarão aqueles dados.
Dados
15
Operações:
• ligar
Serviços • desligar
Dados
Dados:
• ligada (s/n)
• potência
• voltagem
Figura 4: Exemplo de Objeto. Figura 5: Objeto lâmpada.
A interface (pública) de um objeto declara todas as operações permitidas. Todo o acesso aos
dados é feito através da chamada a um método definido pelo objeto. As mudanças na
implementação interna do objeto (que preservem a sua interface externa) não afetam o resto do
sistema.
Benefícios
a) Segurança: protege os objetos de terem seus atributos corrompidos por outros objetos.
b) Independência: “escondendo” seus atributos, um objeto protege outros de complicações
de dependência da sua estrutura interna.
16
O objeto que contém os dados (atributos do objeto) define que serviços estão disponíveis para
outros objetos, ou seja, você só pode usar os métodos do objeto que o programador
disponibilizou para uso. Outra característica, é que os demais objetos podem não ter acesso a
dados individuais. A informação sobre como os serviços são implementados também pode ser
protegida.
Serviços
Dados
Não é possível chegar aos dados diretamente. Para manipular os dados, é necessário recorrer aos
serviços (métodos, variáveis públicas, dentre outros).
17
Observe a diferença do que é visto pelo cliente e do que realmente existe por trás da interface de
nosso programa. Note que os dados ficam escondidos. Esta é uma forma de proteção dos dados.
Tudo que o cliente vê é através da interface e portanto o cliente não manipula os dados.
18
Sobreposição (Overriding)
Para utilizar este conceito, a declaração do método deve ser feita com a mesma assinatura da
super-classe. O cliente que instancia a sub-classe não consegue mais acessar o método que foi
sobreposto da super-classe.
19
Um objeto se comunica com outros pelo envio de mensagens. Uma ação é iniciada por uma
requisição de serviços (mensagem) e uma resposta é enviada para um objeto específico. Essa
ação é uma operação que utiliza ou altera os dados do objeto. A implementação da ação é
denominada método.
Serviços
Dados
Receptor (servidor)
Serviços
Emissor (cliente)
Dados
As mensagens podem ser definas como sendo chamadas a funções que pertencem a um objeto
em particular. As mensagens identificam os métodos a serem executados no objeto receptor.
Para invocar um método, deve-se enviar uma mensagem para o objeto desejado. Para enviar
uma mensagem, deve-se identificar o objeto que receberá a mensagem, identificar o método que
o objeto deverá executar, passar os argumentos requeridos pelo método.
Delegação
O trabalho é transferido, pelo envio de mensagens, de um objeto (cliente) para outro (servidor).
Da perspectiva do cliente, o servidor é quem deve executar os serviços que o cliente necessita.
Trabalho é transferido continuamente até que atinja o objeto que possui os dados e os métodos
para executar a tarefa.
20
Classes/objetos/instâncias
Todo objeto é criado a partir (é uma instância) de uma classe. Geralmente um objeto é a classe
sendo executada no aplicativo (criadas em tempo de execução). Diversos dados (atributos)
podem ser associados a cada objeto. As classes normalmente contêm atributos gerais e
independentes das diversas instâncias (atributos de classe).
Herança (Generalização/Especialização)
21
Normalmente, essas alterações geram uma classe que representa um subconjunto da classe
base, por isso, muitas vezes denominada “especialização”.
Em algumas linguagens temos a herança múltipla, onde uma dada classe pode herdar de mais de
uma classe .
22
Polimorfismo
Uma certa operação, muitas vezes pode ser definida de forma equivalente para atributos de
entrada (parâmetros) de formas diferentes. Polimorfismo permite que diversos métodos (que
difiram em suas assinaturas/cabeçalhos) recebam o mesmo nome, ou seja, uma função membro
de uma classe derivada pode ser sobrescrita para produzir um comportamento diferenciado para
a sub-classe. Isso permite que métodos sejam identificados pelo seu efeito/finalidade de forma
uniforme, simplificando a tarefa do programador.
Exemplos:
area_triangulo = calcula_area(lado1,lado2,lado3);
area_triangulo = calcula_area(base,altura);
area_triangulo = calcula_area(registro_triangulo);
Resumindo:
Polimorfismo é o processo pelo qual diferentes implementações de métodos podem ser acessadas
pelo mesmo nome, além de permitir aplicar a mesma operação (conceitual) a objetos de tipos
diferentes.
Relacionamentos
Mecanismo pelo qual um objeto toma conhecimento dos demais em um programa. Basicamente,
entre os atributos de um objeto deve haver informação que lhe permita identificar um outro
objeto. Há dois (2) tipos básicos de relacionamento, que são:
23
Programar um computador é uma das tarefas mais difíceis que se pode enfrentar. A orientação a
objetos não muda isso. Ela apenas oferece um conjunto de abstrações, métodos e padrões que
viabilizam o desenvolvimento de programas melhores. Não pense que por utilizar um paradigma
novo e mais funcional, tudo será facilitado. Portanto, um estudo minucioso é sempre bom para
um aprendizado eficiente.
24
Criando Objetos
Identificação de substantivos
Primeiro devemos obter (ou produzir) uma narrativa textual que contenha uma descrição do
problema a ser resolvido. Para tanto podemos recorrer a casos de uso (exemplo: RUP ou Praxis),
estatísticas, categorias de itens, dentre outros. Sempre devemos usar substantivos, pronomes e
orações substantivas para identificar objetos e classes. Fora isso, os verbos e locuções verbais
devem ser usadas para identificar serviços e/ou métodos.
25
a) abertura;
b) venda;
c) item vendido;
d) identificação;
e) quantidade;
f) cliente da mercearia;
g) ticket de caixa;
h) forma de pagamento;
i) baixa;
j) estoque;
k) mercadoria.
a) abertura operação
b) venda provável classe
c) item vendido provável classe (item de venda)
d) identificação atributo de item de venda
e) quantidade atributo de item de venda
f) cliente da mercearia entidade fora de escopo
g) ticket de caixa relatório (item de implementação)
h) forma de pagamento atributo de venda
i) baixa operação
j) estoque possível classe (conj. de itens cadastrados)
k) mercadoria provável classe
26
Agora, vamos ver como devemos identificar nossas classes, ou seja, como dar nomes às classe
que vamos criar.
Vejamos agora alguns problemas na criação de classes e a solução para estes problemas.
a) Nome;
b) Atributos (dados);
c) Operações (métodos).
27
28
Além disso devemos desenvolver com coesão. Coesão é o nível de relacionamento entre as
operações pertencentes a uma dada rotina, sendo que diferentes tipos de relacionamento
identificam diferentes níveis de coesão. Nossas rotinas, quando bem planejadas, devem possuir
uma coesão forte.
29
Programação Defensiva
Inclua código para identificar situações de erro extremas (que não deveriam ocorrer se o
programa estivesse certo). Isso evita situações com erros de difícil identificação.
Exemplo:
Os Bitmaps são armazenados em arquivos. Estes arquivos devem ser carregados para variáveis
antes de serem exibidos. Caso o arquivo não esteja disponível, a carga dele gera um lixo. A
exibição deste lixo causa o fim do programa (aborta a execução do aplicativo). Para evitar este
tipo de problema, crie um tratamento de erro que verifica se o arquivo está disponível antes de
exibi-lo.
Agora, vamos ver algumas sugestões para a manipulação/criação de tipos de dados (variáveis,
constantes, estruturas, etc).
Tipos em geral:
30
Tipos booleanos:
O que seria um escopo de variável? É basicamente o local onde a variável pode ser usada, ou
seja, é faixa do programa na qual uma variável está acessível. Normalmente o escopo de uma
variável se inicia na declaração da mesma e termina no fim do bloco que a contém. Em blocos
aninhados, uma nova declaração “oculta” a variável definida em um bloco mais externo. Cada
variável deve ter o escopo mais limitado possível. Lembre-se que cada variável ocupa um espaço
de memória diferente. Economizar nas variáveis, evita gastar toda a memória do computador.
31
Cada variável está ligada a uma posição de memória. Muitos detalhes referentes a isso podem
interferir nosso modo de programar. As características mais importantes sobre variáveis que
devemos saber são:
Já as variáveis globais tendem a introduzir sérios problemas de acoplamento. Seu uso deve ser
apenas quando a rotina requerer manutenção de valores comuns ao programa inteiro ou quando
os dados que precisam chegar a rotinas profundas. Quando usadas, as variáveis globais
requerem algumas precauções:
32
Agora, vamos ver algumas sugestões para nomear funções, procedimentos e métodos.
Ifs simples
Ifs aninhados
33
Layout de programa
Princípios
34
A indentação também tem algumas regras para a “boa prática de programação”. São elas:
Exemplo errado:
case $idade
when 0 .. 18
"criança"
else
"adulto"
end
Exemplo correto:
case $idade
when 0 .. 18
"criança"
else
"adulto"
end
35
Comentários
Cabeçalhos de métodos e classes devem descrever as entradas, saídas e hipóteses sobre essa
unidade, não o seu conteúdo.
Comentários de linha
36
Não basta que o programa execute corretamente, é importante que ele seja legível. As alterações
futuras só serão possíveis se o código for bem organizado e as manutenções dependem do
entendimento do código. O processo de documentação se torna mais simples se o código for bem
organizado e comentado. E lembre-se: Mesmo o autor costuma ter dificuldade em entender um
programa complexo depois de algum tempo.
Resista às tentações!!!
Só porque uma linguagem permite que se escreva uma expressão de forma abreviada e
complexa não quer dizer que seja a forma correta de fazer algo. As demonstrações de domínio da
linguagem só impressionam programadores novatos. A qualidade do programador está na
qualidade do código que ele gera, não na complexidade
37
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
38
39
40
41
42
43
44
45
46
Muito legal, se o objetivo é ganhar o concurso de C “ofuscado” (ou servir exemplo nesta
discussão), mas, fora isso, o código bagunçado como estava antes não serve para mais nada.
47
Conclusão
O desenvolvimento de sistemas é uma das atividades mais interessantes e mais complexas na
área da computação pois integra os mais diversos assuntos como Sistemas Distribuídos,
Engenharia de Software, Estrutura de Dados e Multimídia.
É recomendado que se crie um grupo de pessoas, cada um com um conhecimento específico que
esteja relacionado com as tarefas que devem ser executadas para se desenvolver um bom
sistema.
Espero que este tutorial sirva como um estímulo para o desenvolvimento de outros trabalhos
voltados para a programação. Principalmente em regiões onde ainda não há muitos
programadores.
O autor deste tutorial é Marcelo Cavaco, formado em Processamento de Dados pela Faculdade
Rui Barbosa e formado em Engenharia de Produção pela Unibahia. Já trabalhou como Analista de
Sistemas e Engenheiro e sempre teve um hobby, o RPG... mas esta é uma outra história.
Qualquer dúvida, crítica, sugestão, reclamação, comentário ou algo semelhante, favor mandar
um e-mail para marcelocavaco@click21.com.br.
48