42
Renato Dourado Maia Universidade Estadual de Montes Claros Engenharia de Sistemas Modelagem Orientada a Objetos Programação Orientada a Objetos

Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia

Universidade Estadual de Montes Claros

Engenharia de Sistemas

Modelagem Orientada a Objetos

Programação Orientada a Objetos

Page 2: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Na Unidade I – Gerenciando a Complexidade, vi-mos:

Um sistema de software é inerentemente complexo e muitas vezes ultrapassa a capacidade intelectual huma-na.

Sistemas complexos podem ser analisados a partir de sua decomposição em coisas, os objetos, que têm esta-do e comportamentos próprios.

A complexidade da decomposição pode ser organizada na forma de uma hierarquia com duas relações básicas: “é um tipo de” e “é parte de”.

Os sistemas complexos geralmente evoluem a partir de formas estáveis mais simples.

Lembrando

17/08/2015 2/42

Page 3: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Na Unidade II – Modelagem Orientada a Objetos, veremos:

Como utilizar a metodologia OO para organizar a com-plexidade de sistemas de software.

Quais os principais mecanismos que poderão ser utiliza-dos para isso.

Uma introdução à análise e ao projeto orientado a obje-tos.

Unidade II

17/08/2015 3/42

Page 4: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Unidade II – Modelagem Orientada a Objetos:

A Evolução dos modelos orientados a objetos. A abstração de objetos: encapsulamento, interface e im-

plementação. Reutilizando a implementação. Reutilizando a interface por intermédio de herança. Objetos intercambiáveis: polimorfismo. Introdução à Análise e ao Projeto Orientado a Objetos u-

tilizando a UML (Unified Modeling Language).

Unidade II

17/08/2015 4/42

Page 5: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A análise e o projeto orientados a objetos consti-tuem uma metodologia que nos leva a uma de-composição orientada a objetos de um sistema.

Os modelos resultantes serão centrados nos ob-jetos (coisas/entidades) que compõem o sistema.

A análise OO é bastante diferente da análise es-truturada, que é centrada nos procedimentos.

Modelos OO – Evolução

17/08/2015 5/42

Page 6: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Vários tipos de modelos, cada um capturando as-pectos distintos do sistema, poderão ser criados:

Modelo Lógico: estrutura de classes e objetos. Modelo físico: módulos e processos.

Modelos OO – Evolução

Os modelos OO surgiram como consequência da própria evolução das linguagens de programação...

17/08/2015 6/42

Page 7: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

O processo de abstração também evoluiu!

Lembrando:

Abstrair consiste no processo de retirar do domínio do problema os detalhes relevantes e representá-los não mais na linguagem do domínio, e sim na linguagem da solução.

Modelos OO – Evolução

17/08/2015 7/42

Page 8: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

No contexto da engenharia, abstrair corresponde a criar modelos que serão utilizados para a reso-lução do problema.

Modelos OO – Evolução

Problema

Modelo ABSTRAÇÃO

17/08/2015 8/42

Page 9: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Modelos OO – Evolução Diferentes Abstrações

17/08/2015 9/42

Page 10: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

O processo de abstração também evoluiu:

Todas as linguagens de programação fornecem meios para a criação de abstrações.

A linguagem Assembly é uma pequena abstração da má-quina na qual os programas são executados.

Linguagens imperativas, como BASIC, FORTRAN e C, são abstrações da linguagem Assembly: Nessas linguagens, é necessário pensar em termos da estrutura do

computador, ao invés de se pensar em termos da estrutura do problema a ser resolvido!

Modelos OO – Evolução

17/08/2015 10/42

Page 11: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

O processo de abstração também evoluiu:

O programador deve estabelecer uma associação entre o modelo da máquina (no espaço da solução) e o modelo do problema que está sendo resolvido (no espaço do problema).

O esforço para fazer esse mapeamento pode ser gran-de...

Modelos OO – Evolução

17/08/2015 11/42

Page 12: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

O processo de abstração também evoluiu:

A programação orientada a objetos tenta trazer o espa-ço da solução para o espaço do problema: ambos são representados como objetos!

O programa permite adaptação ao problema por meio da adição de novos tipos ao espaço da solução que ma-peiam os tipos existentes no espaço do problema: des-creve-se o problema em termos do problema e não em termos da solução!

Modelos OO – Evolução

Vocês conseguem perceber como isso é fantástico?

17/08/2015 12/42

Page 13: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

O processo de abstração também evoluiu:

Cada objeto funciona como uma pequena parte do pro-blema, possuindo seu estado e suas operações, o que é semelhante ao que acontece com os objetos do mundo real, que possuem características e comportamentos.

Modelos OO – Evolução

O “mundo computacional” se aproxima mais do “mundo real”...

17/08/2015 13/42

Page 14: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A Abstração de Objetos

O que são objetos?

17/08/2015 14/42

Page 15: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Um objeto é uma variável, e armazena dados...

Então, uma struct é um objeto?

Sim, uma struct é um objeto. Entretanto, um objeto é mais abrangente do que uma

struct: pode-se pedir que determinadas operações se-jam realizadas sobre os objetos.

Assim, um objeto possui atributos, que são os dados, e comportamentos, que são os métodos, procedimentos ou funções que atuam sobre ele.

A Abstração de Objetos

Exemplos de objetos: pessoas, carros, empresas, etc..

17/08/2015 15/42

Page 16: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A Abstração de Objetos

Programação Estruturada Programação Orientada a Objetos

Dados Atributos (Dados)

Funções Métodos

(Funções)

Objeto

17/08/2015 16/42

Page 17: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A Abstração de Objetos

O QUE É UM PROGRAMA EM LINGUAGEM OO?

17/08/2015 17/42

Page 18: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Um programa em linguagem OO é um conjunto de objetos dizendo uns para os outros o que fa-zer por meio do envio de mensagens...

As mensagens, na verdade, podem ser enxerga-das como chamadas a funções que pertencem a um objeto específico.

Cada objeto tem sua própria região de memória, que pode, inclusive, ser composta por outros ob-jetos, e tem um tipo, isto é, pertence a uma clas-se.

A Abstração de Objetos

17/08/2015 18/42

Page 19: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Os objetos, apesar de únicos, fazem parte de uma classe de objetos, possuindo, portanto, ca-racterísticas comuns.

A criação de tipos abstratos de dados, as classes, constitui um conceito fundamental da programa-ção OO:

Tipos de dados abstratos funcionam de maneira similar aos tipos fundamentais:

Podem ser criadas variáveis do tipo: objetos/instâncias. As variáveis podem ser manipuladas.

Objetos e Interfaces

17/08/2015 19/42

Page 20: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Os objetos de cada classe possuem algumas coi-sas em comum:

Toda conta possui um extrato, todo caixa pode aceitar um depósito...

Todo objeto tem seu próprio estado:

Cada conta tem um extrato diferente, cada caixa tem o seu nome...

Assim, caixas, clientes, contas, transações po-dem, cada um, ser representados por uma única entidade no programa, o objeto.

Objetos e Interfaces

17/08/2015 20/42

Page 21: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Objetos e Interfaces

Cada objeto pertence a uma classe, que define o seu comportamento

e as suas características.

17/08/2015 21/42

Page 22: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Classes

17/08/2015 22/42

Page 23: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Depois que uma classe é criada, podem ser cria-dos tantos objetos da classe quanto necessários, que podem ser manipulados como se fossem ele-mentos existentes no problema que está sendo solucionado.

Objetos e Interfaces

Mas como fazer um objeto realizar um trabalho útil?

17/08/2015 23/42

Page 24: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Cada objeto possui métodos (funções) para de-sempenhar suas atividades.

Cada objeto somente pode responder a determi-nadas requisições.

O conjunto de métodos de um objeto é conhecido como sua interface.

Objetos e Interfaces

17/08/2015 24/42

Page 25: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Objetos e Interfaces Lâmpada

Lampada

liga(); desliga(); aumenta_luminosidade(); diminui_luminosidade();

Nome da classe

Interface

UML

Instanciando um objeto e chamando um método:

Lampada Luz; Luz.liga();

17/08/2015 25/42

Page 26: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Que métodos (funções) podem ser chamados?

Isso é a interface!

Onde esses métodos estão codificados, como são implementados?

Isso é a implementação! Geralmente não interessa a quem utiliza o objeto conhe-

cer os detalhes da implementação...

Objetos e Interfaces

17/08/2015 26/42

Page 27: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Um objeto pode ser encarado como um servidor, programado pelo criador da classe.

O cliente do objeto utiliza os métodos por meio de sua interface.

O criador da classe expõe o mínimo da interface para o cliente, escondendo o resto. Por quê?

Porque se está escondido, pode ser mudado sem que o programa do cliente seja quebrado.

Se fosse dado total acesso à implementação interna, o cliente poderia quebrar a integridade do objeto.

Interface, Implementação e Encapsulamento

17/08/2015 27/42

Page 28: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A estratégia utilizada para garantir que determi-nadas partes de uma classe não possam ser a-cessadas pelo “público em geral” é chamada con-trole de acesso...

A interface não apresenta necessariamente todos os métodos de um objeto, mas apenas aqueles que podem ser acessados pelo “público em ge-ral”, os métodos públicos.

Os métodos internos aos objetos são os métodos privados.

Encapsulamento

17/08/2015 28/42

Page 29: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Encapsulamento Videocassete público: Play(); FastForward(); Rewind(); Record(); ... privado: PosicionaCabecaGravacao(posicao); GiraMotor(velocidade); ...

Público x

Privado

17/08/2015 29/42

Page 30: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Encapsulamento

17/08/2015 30/42

Page 31: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Uma vez que uma classe foi criada e testada, ela pode ser utilizada para auxiliar na implementação de outras classes.

Reutilizando a Implementação

Essa é uma das principais vantagens da Programação Orientada a Objetos.

17/08/2015 31/42

Page 32: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A forma mais simples de reutilização é utilizar um objeto daquela classe diretamente.

Exemplos: janela no Windows, matriz em um programa de cálculo, etc ...

Pode-se, também, utilizar um objeto de uma classe dentro de uma nova classe:

Sua classe pode ser composta pelo número e tipo de ob-jetos que se fizerem necessários!

Reutilizando a Implementação

Composição

17/08/2015 32/42

Page 33: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Reutilizando a Implementação

UTILIZAR UM OBJETO DE UMA CLASSE DENTRO DE

UMA NOVA CLASSE

UTILIZAR O OBJETO DA CLASSE DIRETAMETE

COMPOSIÇÃO

VERBOS ASSOCIADOS: CONTER, POSSUIR

UM CARRO CONTÉM 4 RODAS, UM MOTOR, UMA

LATARIA...

REUTILIZAÇÃO

17/08/2015 33/42

Page 34: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Reutilizando a Implementação Composição – Notação UML

Roda Motor

Carro

4 1

Lataria

1114 CabecaDeGravacao

Motor CabecaDeLeitura

Videocassete

ControleDeMotor

17/08/2015 34/42

Page 35: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

A herança permite a criação de uma hierarquia de classes: classes mais especializadas – as clas-ses filhas, herdam propriedades da classe mais geral – a classe pai.

Reutilizando a Interface – Herança

Cria-se uma nova classe programando-se apenas as diferenças entre a classe e a classe pai: a classe filha herda a interface da classe pai, podendo substituí-la

quando se espera um objeto da classe pai!!!

Pode-se compartilhar automaticamente métodos e dados entre diferentes classes, subclasses e objetos

EXPRESSÃO TÍPICA: É UM TIPO DE...

17/08/2015 35/42

Page 36: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Ave é um tipo de Animal. Mamífero é um tipo de Animal. Ave come, dorme, voa e botaOvo. Mamífero come, dorme e mama. Uma Ave, ou um Mamífero, podem

substituir um Animal, pois são tipos de Animal, e, portanto, possuem a mesma interface “base”!

Reutilizando a Interface – Herança

Que delícia crocante!!!

Herança – Exemplo 1

17/08/2015 36/42

Page 37: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Reutilizando a Interface – Herança Herança – Exemplo 2

Triangle, Square e Circle são tipos de Shape, possuem a mesma

interface “base”, e podem substituir Shape ...

17/08/2015 37/42

Page 38: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Cada tipo de Shape deve ter o seu próprio método draw, pois cada uma se desenha de modo diferente!

Os métodos podem ser sobrescritos nas classes derivadas!

Deseja-se utilizar a mesma interfa-ce, mas com um comportamento um pouco diferente para a classe deri-vada.

Reutilizando a Interface – Herança Herança – Exemplo 2

Que delícia crocante de novo!!!

17/08/2015 38/42

Page 39: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Quando trabalhamos com hierarquias, em muitas vezes queremos tratar um objeto não por seu ti-po específico, mas por seu tipo base: isso permi-te escrever código que não depende do tipo es-pecífico e, consequentemente, a adição de novos tipos sem maiores dificuldades:

Por exemplo, no caso das Shapes, poderíamos escrever código genérico que as manipulasse, mandando-as se desenharem, por exemplo, sem nos preocuparmos se são triângulos, círculos ou qualquer outra coisa ...

Objetos Intercambiáveis: Polimorfismo

Adicionar novos tipos é uma das formas mais comuns de estender um programa orientado a objetos para tratar novas situações!

17/08/2015 39/42

Page 40: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Isso é o polimorfismo – “o que possui várias for-mas”:

Propriedade de se utilizar o mesmo nome para métodos diferentes, implementados em diferentes níveis de uma hierarquia de classes.

Para cada classe, tem-se um comportamento específico para o método.

Objetos Intercambiáveis – Polimorfismo

17/08/2015 40/42

Page 41: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Mensagem Final

Não se preocupem demais, no momento atual, com os conceitos:

tudo ficará claro depois!

17/08/2015 41/42

Page 42: Programação Orientada a Objetos · 2015. 8. 17. · Objetos e Interfaces . 17/08/2015 20/42 . Renato Dourado Maia – Programação Orientada a Objetos . Objetos e Interfaces

Renato Dourado Maia – Programação Orientada a Objetos

Esta apresentação é uma adaptação do material originalmente desenvolvido pelo professor Renato Cardoso Mesquita, do Departamento de Engenha-ria Elétrica da Universidade Federal de Minas Ge-rais.

Importante

http://www.cpdee.ufmg.br/~renato/

17/08/2015 42/42