Programação Orientada a Objetos... verbos, e pensando orientado a objetos, damos ênfase aos...
Transcript of Programação Orientada a Objetos... verbos, e pensando orientado a objetos, damos ênfase aos...
Aula POO 1
Programação Orientada a Objetos
Bach. Sistemas de InformaçãoProf: Mai-Ly VanessaDisciplina: Programação II
Aula POO 2
Breve Histórico da Evolução das Linguagens de Programação
Linguagens de Prog. tem mudado muito ao longo do tempo.
Longa viagem
Anos 60: Programação Estruturada Possível escrever programas moderadamente
complexos de forma relativamente fácil. Projetos grandes = difícil e custoso fazer
manutenção e qualquer modificação. Cada marco no desenvolvimento da
programação possibilita tratar com complexidades maiores.
Cada passo combina o melhor dos métodos anteriores com elementos mais avançados.
Muitos projetos estão próximos ou no ponto em que a programação estruturada se torna inviável.
POO veio resolver este problema. POO aproveita as melhores idéias da
programação estruturada e as combina com conceitos mais poderosos.
BinárioProg.
Estruturada
Aula POO 3
POO possibilita que um problema seja decomposto em subgupos relacionados, então usando-se a linguagem podemos traduzir este subgrupo em objeto.
Primeira linguagem que definia classes de objetos e hierarquia de classes foi Simula (1966, Noruega) .
Idéias de Símula foram base para a criação de TAD’s e para Smaltalk.
Smaltalk foi desenvolvida na Xérox, na década de 70 e incorporou além dos conceitos de Símula, a idéia de objetos ativos, prontos a “reagir” a mensagens que ativam “comportamentos” específicos do objeto. Várias linguagens Orientadas a Objeto foram desenvolvidas como: C++, Object Pascal, Eiffel e
mais recentemente: Tool. Smalltalk, uma das mais populares linguagens
orientadas a objetos, assim como outraslinguagens orientadas para objetos, tem sidousada em aplicações variadas onde a ênfase estána simulação de modelos de sistemas, comoautomação de escritórios, animação gráfica,informática educativa, instrumentos virtuais,editores de texto e bancos de dados em geral,entre outras
Aula POO 4
Uma das atividades mais interessantes emInformática é certamente a busca constantede melhorias nas linguagens e técnicas parao desenvolvimento de software.
A Programação Orientada a Objetos utilizaos conceitos que aprendemos no jardim deinfância: objetos e atributos, todos e partes,classes e membros. É difícil explicar por quedemoramos tanto a aplicar estes conceitos àanálise e especificação de sistemas deinformações. Talvez estivéssemos ocupadosdemais “seguindo a boiada”
O conceito de Orientação Objeto dependemais da mentalidade do programador do queda linguagem de programação que estásendo utilizada. Pode-se conseguirprogramas razoavelmente orientados aobjeto em linguagens tipicamenteestruturadas, assim como pode-se conseguirprogramas estruturados em linguagensvoltadas para objetos.
Vejamos a frase
“O navio atraca no porto e descarregasua carga.”
Aula POO 5
Analisando estruturalmente -> como o navio atraca no porto e como ele faz para descarregar sua carga Ênfase na ação).
Em orientação objeto, o enfoque com quese encara a frase é diferente: primeiropensaríamos no objeto navio, no objetoporto e no objeto carga, pensando comoeles seriam e procurando definir seucomportamento. Após isto é quepensaremos em como o navio se relacionacom o porto e com a carga, e como o portose relaciona com carga.
De modo grosseiro, podemos dizer que aoanalisarmos uma frase pensandoestruturadamente, damos ênfase aosverbos, e pensando orientado a objetos,damos ênfase aos substantivos.
Programador experiente => Inicialmentetem grande dificuldade em migrar paraPOO.
Tem que se analizar os problemasestruturadamente, para reaprender aanalisá-los de forma voltada a objeto.
Vantagems da POO Sensível redução no custo de
manutenção do software Aumento na reutilização de código
Aula POO 6
Redução no custo: Em POO existem certas características (herança e encapsulamento) que permitem que, quando for necessária alguma alteração, modifique-se apenas o objeto que necessita desta alteração, e ela propagar-se-á automaticamente às demais partes do software que utilizam este objeto.
Aumento na reutilização de código : com orientação a objeto podemos acessar e usar como se fossem seus os métodos e a estrutura de outro objeto. Caso existam dois objetos bastante semelhantes, podemos escrever os métodos apenas uma vez e usá-los para os dois objetos. Apenas o que realmente for diferentes para os dois objetos é que precisa ser escrito individualmente.
Aula POO 7
Há uma grande discussão sobre o que é exatamente uma linguagem orientada a objetos.
Vejamos os conceitos básicos do Paradigma de Orientação a Objetos: Objetos, Classes, Mensagens, Métodos, Herança, Generalização, Especialização, Abstração, Polimorfismo, Encapsulamento e Late-Binding.
CLASSE Conjunto de dados estruturados que são
caracterizados por propriedades comuns. Também pode ser interpretado como uma estrututura modular completa que descreve as propriedades estáticas e dinâmicas dos elementos manipulados pelo programa. Define a estrutura e o comportamento comum
a todos os objetos que são relacionados. Um objeto possui uma identidade e suas características serão definidas para a classe.
Uma classe é definida por: um nome da classe; o nome da sua superclasse; o nome de suas variáveis privadas; os nomes e as definições de todas as operações associadas a esta classe;
Classe é um conceito estático, objeto é um conceito puramente dinâmico.
Aula POO 8
class fila {int f [100];int primeiro, ultimo;
public:void inicio (void);void put (int valor);int get (void);
}
Uma classe pode conter tanto partes públicas como privadas.
Para tornar públicas as partes de uma classe, ou seja, acessíveis o outras partes do programa, é preciso declará-las após a palavra public
ATRIBUTOS Um atributo é um dado para o qual cada objeto
tem seu próprio valor. São, basicamente, a estrutura de dados que vai representar a classe.
Exemplo de atributos, usando a classe fila: int f [100] ; int primeiro, ultimo;
Aula POO 9
MÉTODOS Representam as operações que os objetos
pertencentes a uma classe podem executar. É a implementação de uma rotina, ou seja, o
código propriamente dito. Ex:
void iniciar (void){
primeiro = 0;ultimo = 0;
};void put ( int valor){
f [ultimo] = valor;ultimo++;
};OBJETOS
Seriam os objetos como sendo os objetos físicos do mundo real
É uma entidade lógica que contém dados e código para manipular esses dados. Os dados são denominados como sendo atributos do objeto, ou seja, a estrutura que o objeto tem, e o código que o manipula denominamos método. Um método é uma função que manipula a estrutura de dados do objeto
Aula POO 10
Um objeto é um ente independente, composto por: estado interno, uma memória interna em
que valores podem ser armazenados e modificados ao longo da vida do objeto.
comportamento, um conjunto de ações pré-definidas (métodos), através das quais o objeto responderá a demanda de processamento por parte de outros objetos.
Ex: Uma tela de computador pode ter os seguintes atributos e métodos: atributos modo de operação /* texto/gráfico */ tamanho horizontal tamanho vertical paleta de cores cor atual
métodos modo texto ( ) modo gráfico ( ) fecha modo gráfico ( ) muda cor ( )
Aula POO 11
Podemos notar que um objeto é composto por estrutura e processos, onde esses processos giram em torno da estrutura, ao contrário das linguagens funcionais, nas quais a estrutura se adapta a função. Um objeto só pode ser manipulado por sua estrutura e seus métodos, nada mais do que isso.
Somente um objeto de um determinado tipopode acessar seus métodos e estrutura, umoutro tipo de objeto não tem nenhum acesso aestes.
Dentro de um objeto, alguns métodos e/ouestrutura podem ser privados, ao objeto, o quenos diz que são inacessíveis diretamente paraqualquer elemento fora dele. Podem sertambém públicos ou protegidos.
Mais exatamente, cada objeto é umainstância de sua classe. É a classe quecontém a descrição da representaçãointerna e dos métodos comuns a todas assuas instâncias (objetos).
Cada instância da classe, por sua vez,possui sua própria memória privativa (seuestado interno) onde ficam armazenadosos valores de seus componentes, querepresentam suas característicasindividuais
Aula POO 12
Com isso podemos diferenciar claramente uma classe de objeto. A classe é apenas um tipo de dado, que somente representa características comuns a determinados objetos.
Os objetos de uma determinada classe nãosão iguais. Apenas possuem a mesmaestrutura e compartilham as mesmasoperações sobre estas estruturas.
Uma coisa importante de um objeto é seuciclo de vida, que engloba o momento emque é declarado até sua eliminação. Noinstante em que um objeto é declarado, éalocado um espaço em memória para ele eautomaticamente executado seu construtor.A partir deste momento o objeto está prontopara ser usado. Esta fase vai até aeliminação do objeto.
Em programação orientada a objetos,primeiramente o que deve ser identificadosão os objetos que o problema requer (atémesmo os tipos simples de dados são vistoscomo objetos, porque têm estrutura eoperações (métodos) que o manipulam).
Aula POO 13
MENSAGENS Mensagens são requisições para que um
objeto execute uma de suas ações. Cada objeto somente pode responder às
mensagens que constem no seu protocolo ou no protocolo de sua superclasse.
Atender a uma mensagem significa executar algum método.
Objetos interagem através de mensagens. Assinatura de uma mensagem é formada pelo
nome da mensagem e por seus parâmetros de entrada e saída juntamente com seus respectivos tipos.
Ex. Considerando a classe fila criada anteriormente fila f_atual; ... ...uma mensagem a este objeto seria: f_atual.quantos();
Aula POO 14
ENCAPSULAMENTO Encapsulamento é combinar os dados (atributos)
e o código que manipula estes dados (métodos) em um único objeto com acesso controlado.
Em outras palavras, encapsulamento diz respeito à definição de uma estrutura que contenha os dados, defina quais os métodos de acesso público a esses dados e possua meios de proteger os demais métodos e os dados contra acesso direto.
Fica a pergunta: “Porque impedir este acesso?” Imagine um objeto polinômio. Vamos supor que a
estrutura de dados utilizada para representar um polinômio dentro do objeto seja um vetor. Este objeto, quando criado, recebe um string contendo o polinômio que ele representará (por exemplo, “x2 + 2x +10”) e possui, entre outros, um método para, dado um x, calcular f(x).
Considere o código:
Objeto
AplicaçãoAtributos
Métodos
Aula POO 15
class Termo{Float coeficiente;Int expoente; }
class polinomio{Termo vetor[30];polinomio(String novo)
{ ... }void insere (Float coef; Int expo)
{ ... }Float calcula_fx(Float x)
{ ... }}
Suponha que eu não tenho este método e quenão exista encapsulamento. Como seria se minhaaplicação precisasse calcular f(x)? Ela calcula!!Beleza!
Se um dia você resolver representar o polinômiocomo uma lista encadeada e não mais como umvetor? O que acontece com o código da aplicaçãopara calcular f(x)?
No caso de termos o encapsulamento como estamudança atingiria a aplicação? As mudanças nãoseriam tão drásticas!
O encapsulamento garante que minha classe sejauma caixa preta para o usuário.
Aula POO 16
Além desse aspecto, ainda há o da proteção dos dados encapsulados. Restringir o acesso dos atributos aos métodos da classe garante que nenhum dado será alterado por engano ou de forma descontrolada.O encapsulamento protege os dados, e faz o uso do objeto ser mais seguro.
Note-se que este conceito possui efeito contrário para um objeto mal definido.
HERANÇA Herança é a propriedade dos objetos que permite
a criação de uma hierarquia entre eles, onde osdescendentes herdam o acesso ao código eestruturas de dados dos seus ancestrais.
Coad-Yourdon define Herança como:“Mecanismo para expressar a similaridade entreclasses, simplificando a definição de Classessimilares a outras que já foram definidas. Elarepresenta generalização e especialização,tornando atributos e serviços comuns em umahierarquia de Classe”.
Vejamos um exemplo simples. Digamos que eutenha uma classe Animal.
Aula POO 17
Todos os objetos da classe Animal possuem características (atributos) comuns, como peso, altura, idade, etc. Também fazem determinadas tarefas (serviços ou métodos) como Comer, Procriar, Nascer, Morrer, etc.
Eu posso abstrair esse objeto Animal para reduzi-lo à seguinte representação:
class Animal {int Peso, Altura, Idade;boolean EstaComFome;
public:Animal( ) { ... } /* Construtor */boolean ComFome( );int Peso( );int Altura( );...}
Digamos que agora eu precise definir uma classe mamíferos. Eles são animais mas fazem algumas coisas diferentes de outros animais como mamar ou gestar filhotes. Sem herança replicaríamos todo o código de Animal e então acrescentaríamos as particularidades de mamífero. Com herança podemos fazer Mamífero herdar de Animal.
Aula POO 18
Na verdade, é fácil perceber que Mamífero é naverdade uma especialização de Animal, umherdeiro dessa classe. Assim, se eu dispuser deum mecanismo que me permita declararMamífero como tal, e assim herdar todos osmétodos e atributos da classe ancestral, nãoprecisarei replicar código, apenas incluirei osmétodos e atributos específicos na classeMamífero, e redefinirei os métodos que acharnecessário. O mecanismo que me permite isso éa Herança.
Exemplo de uma hierarquia de classes
Aula POO 19
Um método pode ser definido em uma classe e redefinido em uma subclasse caso isto seja necessário.
É importante entender que cada objeto vai ter o seu próprio grupo de atributos. A chamada à Chita.Mamar( ) vai afetar as variáveis de Chita unicamente, e não de algum objeto Mamífero declarado.
Também é importante não confundir Herança com Composição de Classes. Composição de classes é quando temos uma classe que possui como atributo um objeto de outra classe. Por exemplo, podemos dizer que o objeto carro possui pneus, e podemos colocar na sua lista de atributos quatro objetos Pneu:
class Carro{Pneu pneus[4];...}
Assim, a pergunta-chave para distinguir herança de composição é: A minha classe possui a classe X, ou ela é X? Se ela possui, temos composição, se ela é, temos herança.
Aula POO 20
POLIMORFISMO Polimorfismo é a propriedade de uma ou mais
classes responderem a mesma mensagem, cada uma de uma forma diferente. Desta forma é possível explorar similaridades entre diferentes classes de objetos.
Um objeto emissor envia uma mensagem, se oobjeto receptor implementa um método com amesma assinatura, ele poderá respondê-la.
Diferentes respostas serão possíveis para amesma mensagem (ou chamada), dependendode como os métodos dos receptores estãoimplementados.
No Java e C++ o polimorfismo é implementadopelo uso de sobrecarga de funções. Duas oumais funções podem compartilhar o mesmonome, contanto que as suas declarações deparâmetros sejam diferentes.
O programa a seguir cria três funções similares,porém diferentes, chamadas de quadrado. Cadauma delas retorna o quadrado do seu argumento.Como o programa ilustra, o compilador sabe qualfunção usar em cada situação por causa do tipode argumento.
Aula POO 21
int quadrado (int i);double quadrado (double d);long quadrado (long l);main (void){
cout << quadrado (10) << “\n”;cout << quadrado (11.0) << “\n”;cout << quadrado (90000) << “\n” ;return 0;
}int quadrado ( int i){
cout << “Dentro da função quadrado ( ) que usa “;cout << “um argumento inteiro.\n”;return i*i;
}double quadrado (double d){
cout << “Dentro da função quadrado ( ) que usa “;cout << “um argumento double.\n”;return d*d;
}long quadrado (long l){
cout << “Dentro da função quadrado ( ) que usa “;cout << “um argumento long.\n”;return l*l;
}
Aula POO 22
O que torna a sobrecarga de funções importante é o fato de ela poder ajudar à simplificar o entendimento do software permitindo que um conjunto de funções semelhantes seja acessado usando-se um único nome.
Você pode usar o mesmo nome parasobrecarregar funções não relacionadas,mas não deve fazê-lo. Ex. Usar o mesmonome em uma função para retornar oquadrado e a raiz quadrada de um inteiro eum float.
Tipos Clássicos de Polimorfismo De operadores: (distinção pelo tipo do
elemento): já vem implementado emtodas as linguagens. Por exemplo, sevocê deseja somar dois números inteiros;
Redefinição de operadores: utilizadaquando necessita-se de operações quenormalmente não são disponíveis nalinguagem de programação. Porexemplo, soma de matrizes.
Dois métodos iguais na mesma classe:distinguem-se pelo número e/ou tipo deparâmetros ou objetos referenciados ;
Aula POO 23
LATE BINDING Late Binbing é um técnica que não esta
ligada somente as linguagens Orientadas a Objetos, muitas outras linguagem usam esta técnica, principalmente as linguagens não tipadas.
Apesar de não haver muita bibliografiasobre esta técnica no que se refere aorientação a objeto, esta é a técnica quepermite a existência de muitos conceitos doparadigma orientado a objetos.
Na programação orientada a objeto aodefinir uma classe ela pode usar objetosque não foram definidos ainda e sercompilada normalmente.
Existem várias formas de Ligação Tardia ediferentes em cada linguagem, portanto nãoexiste nenhum padrão rígido para LigaçãoTardia.
Vejamos algumas definições: É a técnica de adaptar objetos a
determinadas situações; É usar objetos definidos em módulos
completamente independentes, de modo quenão é necessário conhecer o estado domódulo, apenas a sua interface;
Aula POO 24
Escolha de uma propriedade num conjunto delas. Durante o processamento (interpretação/compilação) são definidos conjuntos de possibilidades.
Ligação precoce e tardia: referem-se aos eventos que ocorrem no momento da compilação, e no momento da execução respectivamente.
Em relação à orientação a objetos, ligaçãoprecoce significa que um objeto é ligado asua chamada de função no momento dacompilação, isto é , todos as informaçõesnecessárias para determinar qual funçãoserá chamada são conhecidas quando oprograma é compilado. A principal vantagemda ligação precoce é a eficiência - é maisrápido e requer menos memória.
A ligação tardia significa que um objeto éligado à sua chamada de função namomento da execução. Isso determina nodecorre da execução do programa qualfunção se relacionará com qual objeto. Avantagem é a flexibilidade.