Programação Orientada para Objectos ETI e IGE ISCTE 1 Docentes Ricardo Ribeiro [email protected] Gabinete D6.21 Cacifo 292 Responsável: 2 Prof. Manuel Menezes de Sequeira 2003/2004 Programação Orientada para Objectos Informação 3 http://iscte.pt/programacao/p2/ http://br.groups.yahoo.com/group/poo-iscte/ [email protected] Diapositivos das aulas teóricas Resumos das aulas práticas 2003/2004 Programação Orientada para Objectos Avaliação Problema: 10% Trabalho final: 40% 4 Entrega intermédia: avaliação negativa = -3 valores Entrega final: trabalho completo Em grupo com discussão individual Frequência: 50% Em grupo Individual sem consulta: nota mínima 7 Grupos: 2 alunos 2003/2004 Programação Orientada para Objectos Objectivos 5 Conhecer os princípios básicos da resolução de problemas usando diversos paradigmas de programação. Ter conhecimentos sólidos da linguagem C++ e conhecimentos básicos da sua biblioteca padrão. Saber desenhar estruturas de dados e respectivos algoritmos em C++. Saber lidar com erros durante o desenvolvimento e fazer programas com um comportamento razoável face a erros. Ser capaz de planear a resolução dos problemas, analisando, desenhando e implementando correctamente os correspondentes programas. Ter conhecimentos elementares sobre a linguagem UML. 2003/2004 Programação Orientada para Objectos Aula 1 Modularização física e em pacotes 6 Divisão de um programa 7 Mais fácil dividir trabalho Permite divisão lógica do programa de acordo com objectivo das ferramentas Construção do executável acelerada Facilita reutilização de código 2003/2004 Programação Orientada para Objectos Modularização Procedimental: rotinas De dados: classes Ficheiros Em pacotes: pacotes 8 Classes Física: módulos físicos (ou módulos) Funções e procedimentos Espaços nominativos 2003/2004 Programação Orientada para Objectos Modularização procedimental Módulos são rotinas que modularizam algoritmos: Caixas pretas que separam interface de implementação: interface: cabeçalho implementação (mecanismo): corpo Escondem implementação (encapsulamento): 9 consumidor da rotina limita-se a invocá-la 2003/2004 Programação Orientada para Objectos Modularização de dados Módulos são classes que modularizam dados e respectivas operações: Caixas pretas que separam interface de implementação: Escondem a implementação (encapsulamento): 10 interface: operações públicas (e restantes membros públicos) Implementação: métodos e membros privados consumidor da classe limita-se a usá-la 2003/2004 Programação Orientada para Objectos Modularização física Divisão de um programa em ficheiros Módulos são conhecidos por… módulos Módulos físicos são pares de ficheiros fonte: Ficheiro de interface (.H) Ficheiro de implementação (.C) 11 como se usam e o que fazem as ferramentas disponibilizadas pelo módulo implementação das ditas ferramentas Consumidor do ficheiro usa o ficheiro de interface 2003/2004 Programação Orientada para Objectos Módulo programa programa.C: #include "matematica.H" #define TURMAS_GRANDES #ifdef TURMAS_GRANDES int const número_máximo_de_alunos = 100; #else int const número_máximo_de_alunos = 30; #endif int main() { int notas[número_máximo_de_alunos]; ... cout << média(notas, 10) << endl; } 12 2003/2004 Programação Orientada para Objectos Módulo matematica matematica.H: double média(int const m[], int const n); matematica.C: #include "matematica.H" double média(int const m[], int const n) { double soma = 0.0; for(int i = 0; i != n; ++i) soma += m[i]; return soma / n; } 13 2003/2004 Programação Orientada para Objectos Construção de um executável 1. Pré-processamento: pré-processador c++ -E programa.C –o programa.ii c++ -E matematica.C –o matematica.ii 2. Compilação: compilador c++ [opções] –c programa.C c++ [opções] –c matematica.C 3. Fusão (to link): fusor (linker) c++ -o programa programa.o matematica.o 14 2003/2004 Programação Orientada para Objectos Pré-processamento Copia ficheiro de implementação (.C) para unidade de tradução (.ii) Directivas de pré-processamento (linhas iniciadas por #): 15 Inclusões (#include) Macros (#define) Compilação condicional (#ifdef; #ifndef; #else; #endif) 2003/2004 Programação Orientada para Objectos Compilação Tradução de unidade de tradução para linguagem máquina Fases da compilação: 1. 2. 3. 4. 5. 16 Análise lexical Análise sintáctica Análise semântica Optimização Geração de código máquina 2003/2004 Programação Orientada para Objectos Análise lexical Divide em palavras e símbolos a sequência de caracteres que constitui o ficheiro fonte Verifica a correção dos símbolos Exemplo para a língua Portuguesa: A a alfac um choou ovo. Erros! 17 2003/2004 Programação Orientada para Objectos Análise sintáctica Verifica as regras de gramática da linguagem Exemplo para a língua Portuguesa: A a alface um chocou ovo. Erros! 18 2003/2004 Programação Orientada para Objectos Análise semântica Verifica se, apesar de sintacticamente correcta, a sequência de símbolos faz sentido Exemplo para a língua Portuguesa: A alface chocou um ovo. Erro! 19 2003/2004 Programação Orientada para Objectos Optimização e geração de código máquina Optimização Geração de código máquina 20 Elimina o código redundante Simplifica expressões Elimina variáveis desnecessárias … Gera em linguagem máquina as instruções que realizam o especificado inicialmente na linguagem C++ 2003/2004 Programação Orientada para Objectos Ficheiros objecto programa.o 21 matematica.o Disponibilidades main() Disponibilidades média() Necessidades média() Necessidades 2003/2004 Programação Orientada para Objectos Fusão Ficheiros objecto fundidos num único executável Verifica que: 22 Não há repetições Há uma função main() Para cada necessidade existe correspondente disponibilidade 2003/2004 Programação Orientada para Objectos Exemplo «file» matemática.C «file» matemática.H «file» programa.C Ficheiros fonte Pré-processamento «file» matemática.ii «file» programa.ii Unidades de tradução Compilação «file» matemática.o «file» programa.o Ficheiros objecto Fusão «file» programa 23 2003/2004 Programação Orientada para Objectos Bibliotecas Bibliotecas ou ficheiros de arquivo Como arquivar ficheiros objecto ar ru libarquivo.a ficheiro_objecto.o … Como compilar com bibliotecas 24 Prefixo: lib Extensão: .a c++ … -larquivo 2003/2004 Programação Orientada para Objectos Modularização física Dois ficheiros fonte: 25 Interface (.H) Implementação (.C) Que colocar em cada módulo? Que colocar em cada ficheiro fonte? 2003/2004 Programação Orientada para Objectos Ficheiros de interface (.H) 26 Definições de classes Declarações de rotinas não-membro e não inline Definições de rotinas e métodos inline Definições de constantes Declarações de variáveis globais (evitar!!!) 2003/2004 Programação Orientada para Objectos Ficheiros de implementação (.C) 27 Definições de tudo o que for apenas necessário dentro do módulo (classes, rotinas, ...) Definições de todas as rotinas e métodos que não sejam inline Definições de todas as variáveis globais 2003/2004 Programação Orientada para Objectos Modularização em pacotes Agrupamento das ferramentas num nível mais elevado de modularização: os espaços nominativos (name spaces) Principais razões para o uso de pacotes: 28 Evitar problema de colisão de nomes Distribuir software 2003/2004 Programação Orientada para Objectos Colisão de nomes (I) Verão software logistica.H Inverno software contabilidade.H ... void consolida(); ... logistica.C ... void consolida(); ... contabilidade.C ... void consolida() { ... } ... liblogistica.a: ... void consolida() { ... } ... libcontabilidade.a: logistica.o 29 contabilidade.o 2003/2004 Programação Orientada para Objectos Colisão de nomes (II) programa.C: #include <contabilidade.H> #include <logistica.H> int main() { consolida(); } 30 Qual das versões do procedimento é invocada? 2003/2004 Programação Orientada para Objectos Colisão de nomes (III) Comando de construção do executável: c++ -o programa programa.C -llogistica -lcontabilidade Compilação tem sucesso: Comando de construção do executável: 31 Fusão dos arquivos pára quando o procedimento é encontrado Seguintes não são pesquisados c++ -o programa programa.C logistica.o contabilidade.o Fusão dá erro por definição duplicada! 2003/2004 Programação Orientada para Objectos Definição de espaços nominativos Verão software logistica.H Inverno software contabilidade.H namespace VerãoSoftware { ... void consolida(); ... namespace InvernoSoftware { ... void consolida(); ... } } logistica.C contabilidade.C ... Void VerãoSoftware::consolida() { ... } ... 32 ... void InvernoSoftware::consolida() { ... } ... 2003/2004 Programação Orientada para Objectos Utilização de ferramentas em espaços nominativos programa.C: #include <contabilidade.H> #include <logistica.H> int main() { VerãoSoftware::consolida(); InvernoSoftware::consolida(); } 33 2003/2004 Programação Orientada para Objectos Organização Podemos ter hierarquias de espaços nominativos namespace InvernoSoftware { namespace Contabilidade { void consolida(); } } Colocar ficheiros de interface em directórios correspondentes ao espaço nominativo a que pertencem 34 InvernoSoftware/Contabilidade/contabilidade.H 2003/2004 Programação Orientada para Objectos Aula 1: Sumário Modularização: física e em pacotes Noções de modularização física e compilação separada: Noções de modularização em pacotes e espaços nominativos (namespaces): 35 Vantagens. Fases da construção dum programa Compilação Noções sobre ficheiros de interface (.H), fonte (.C), objecto (.o), biblioteca ou arquivo (.a), e executável Conteúdo dos ficheiros de implementação e de interface Utilidade Sintaxe Utilização 2003/2004 Programação Orientada para Objectos