Algoritmia e Programação APROG Modularidade Algoritmia e Java Nelson Freire (ISEP–DEI-APROG 2012/13) 1/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 2/29 Introdução Noção de Modularidade Mecanismo fornecido pelas Linguagens de Programação ... ... que permite decomposição dum programa em módulos Estrutura Geral de um Programa Modular Módulo 1 Módulo 2 Módulo 3 Módulo Principal Módulo Sequência de instruções que executa tarefa específica Exemplos RAIZQUADRADA() e ALEATORIO() // Módulos pré-definidos Módulo Principal (ou Programa Principal) Primeiro módulo executado Controla execução do programa Nelson Freire (ISEP–DEI-APROG 2012/13) 3/29 Execução de Programa Modular Introdução Controlada pelo Módulo Principal Na chamada de um módulo, controlo passa temporariamente para módulo chamado Após execução de módulo, controlo retorna para módulo que o chamou instrução 1 Módulo instrução m Chamada Retorno instrução 1 instrução i Módulo Principal instrução i+1 ou Outro Módulo instrução n Nelson Freire (ISEP–DEI-APROG 2012/13) 4/29 Motivações para Usar Introdução Principais Decomposição de programa em blocos mais pequenos Reduzir a complexidade do desenvolvimento Aplicação direta da estratégia dividir-para-conquistar (abordagem top-down) Tornar mais rápido o desenvolvimento Módulos independentes podem ser criados em paralelo Reutilização de módulos Tornar mais rápido desenvolvimento Tornar programa mais pequeno Programa Módulo 1 Módulo 2 Abstração da implementação de tarefa Facilitar o desenvolvimento Programador abstrai-se dos detalhes da implementação Exemplo RAIZQUADRADA(x) Síntese Facilitar Tornar mais rápido Reutilização n (C p n! ( n p )! p! ) Módulo 3 Módulo 4 Decomposição ( g ( x ) f 1( x ) f 2( x )) Módulo Principal desenvolvimento de programas Nelson Freire (ISEP–DEI-APROG 2012/13) 5/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 6/29 Comunicação entre Módulos Formas Variáveis Globais Passagem de Parâmetros Módulo 1 Módulo n Módulo Principal Programa Nelson Freire (ISEP–DEI-APROG 2012/13) 7/29 Comunicação entre Módulos Variáveis Globais Definição Varíáveis de âmbito global Acessíveis a qualquer módulo Declaração Fora dos módulos Algoritmia Estrutura Geral com Variáveis Globais Declaração de Variáveis Globais Módulo 1 Módulo n Módulo Principal Desvantagens Dificultam a compreensão do algoritmo Preciso analisar todo algoritmo para verificar forma como são utilizadas Consequentemente Dificuldades de deteção de erros aumentam com dimensão do algoritmo Dificultam reutilização dos módulos noutros algoritmos Requer existência das mesmas variáveis globais Solução Usar apenas variáveis locais Comunicação entre módulos através da passagem de parâmetros Nelson Freire (ISEP–DEI-APROG 2012/13) 8/29 Comunicação entre Módulos Variáveis Locais Definição Declaradas dentro de módulos Âmbito local, i.e., acessíveis apenas dentro dos módulos aonde são declaradas Só existem durante execução do respectivo módulo Algoritmia Estrutura Geral com Variáveis Locais Módulo 1 Variáveis Locais Módulo n Variáveis Locais Módulo Principal Variáveis Locais Vantagens Módulos são independentes Facilitam desenvolvimento e testes dos programas Nelson Freire (ISEP–DEI-APROG 2012/13) // caixas negras 9/29 Comunicação entre Módulos Passagem de Parâmetros Meio de Comunicação entre Módulos Independentes Módulos que usam apenas variáveis locais Mecanismo de Passagem de Parâmetros Parâmetros Funcionam como variáveis locais // âmbito local Suportam a transferência de informação entre módulos // por cópia Entrada de Dados Saída de Resultados Tipos de Parâmetros Formais // do módulo chamado; também designados apenas parâmetros Atuais // usados na chamada dum módulo para inicializar os seus parâmetros formais // designados também argumentos Módulo Módulo Chamado Parâmetros Formais Dados Resultados Parâmetros Actuais Módulo que Chama Módulo Nelson Freire (ISEP–DEI-APROG 2012/13) 10/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 11/29 Algoritmia Tipos de Módulos Paradigma de Programação Procedimental Orientada aos procedimentos // Procedimentos = Módulos Tipos de Módulos Função Procedimento Estrutura Geral de Algoritmo Modular Procedimento 1 Função 1 Programa Principal Nelson Freire (ISEP–DEI-APROG 2012/13) 12/29 Função Algoritmia 1/2 Definição Módulo que executa uma sequência de instruções e, no final, retorna um valor no ponto da sua chamada Exemplo do SENO de um ângulo resultado 2 + seno(pi/2) // seno(pi/2) é substituído por 1 (valor retornado) Motivação para Criar Usar numa expressão Exemplos de expressões Numérica resultado 100 + raízquadrada(25) Alfanumérica nome apelido(“Rui Costa”) Booleana SE ( valido(valor) = VERDADEIRO ) ENTÃO ESCREVER(valor) FSE Nelson Freire (ISEP–DEI-APROG 2012/13) 13/29 Função Algoritmia 2/2 Declaração Sintaxe DEFINIR tipo_retornado nome (tipo pf1, ..., tipo pfn) ED // variáveis e constantes locais (*) INÍCIO // corpo da função RETORNAR expressão_do_tipo_retornado (**) FDEF Exemplo DEFINIR INTEIRO funcao(INTEIRO x, INTEIRO y) ED INTEIRO res INÍCIO SE (x≥0) ENTÃO res x+y SENÃO res x-y FSE RETORNAR res // res é do tipo_retornado FDEF Chamada Sintaxe: Exemplo: nome(pa1,pa2, ..., pan) resultado 5 + funcao(23, 2) Nelson Freire (ISEP–DEI-APROG 2012/13) // cabeçalho • Lista de parâmetros formais (pf) • Opcionais ( lista pode ser vazia) • Nome pode ser qualquer • Independente dos param. actuais • Funcionam como variáveis locais • Só visíveis dentro da função • Inicializadas pelos parâmetros actuais no momento da chamada da função (*) • Têm âmbito local • Só visíveis dentro da função • Só existem durante execução da função (**) • Só pode retornar 1 valor • Termina execução da função • Lista de parâmetros actuais (argumentos) • Coincidem em número e tipo com os pf • Inicializam os parâmetros formais com uma cópia 14/29 Procedimento Algoritmia Definição Módulo que executa sequência de instruções Motivação para Criar Usar como instrução Exemplo ESCREVER(“Olá”) Declaração DEFINIR nome (tipo pf1, tipo pf2, ...., tipo pfn) ED // variáveis locais INÍCIO // corpo do procedimento FDEF Chamada Sintaxe: nome(pa1, pa2, ..., pan) Nelson Freire (ISEP–DEI-APROG 2012/13) 15/29 Modularidade Estrutura Geral de Algoritmo Modular //Programa Principal ED Ordem dos módulos é arbitrária // declarações de variáveis e constantes locais INÍCIO // Corpo do programa principal FIM // Procedimento DEFINIR nomeProcedimento(lista_parâmetros_formais) ED // declarações de variáveis e constantes locais INÍCIO // corpo do procedimento FDEF // cabeçalho // Função DEFINIR tipo_de_valor_retornado nomeFunção(lista_parâmetros_formais) ED // declarações de variáveis e constantes locais INÍCIO // corpo da função contendo a instrução RETORNAR FDEF Nelson Freire (ISEP–DEI-APROG 2012/13) // cabeçalho 16/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 17/29 Gestão de Memória Modelo de Memória de um Programa Código e Dados estão separados Program Counter Controla a execução do Código Guarda o endereço da instrução corrente do programa Incrementado depois da execução de cada instrução Código Program Counter Stack Guarda dados do programa Sempre que é chamado um módulo É adicionado um segmento de memória, chamado registo de activação (RA) Environment O RA serve para guardar os parâmetros formais e as Pointer (EP) variáveis locais do módulo O EP é colocado a apontar para esse registo de activação Quando termina a execução do módulo O RA é libertado da stack // disciplina LIFO Registos O EP é colocado a apontar para a sua posição anterior Registos Para guardar temporariamente endereços e dados Nelson Freire (ISEP–DEI-APROG 2012/13) ... Dados Stack ... ... 18/29 Gestão de Memória L 1 2 3 5 6 7 8 Mecanismo de Passagem de Parâmetros // Módulo Principal ED : INTEIRO n, r, s INÍCIO n3 r factorial(n) s factorial(n-1) FIM DEFINIR INTEIRO factorial(INTEIRO x) ED : INTEIRO f, i INÍCIO f1 PARA (ix ATÉ 1 PASSO -1) FAZER ff*i FIMPARA RETORNAR f FIMDEFINIR L S S L S L S L S L S L S n 6 n 3 7 n 3 6 n 3 5 n 3 6 n 3 8 n 3 r r r r r r r s s s s s s 1 n 3 x 3 x 3 x 3 x 2 x 2 r f 1 f 6 f 6 f f 2 s i 3 i 2 i 0 i i 1 6 1 6 7 n 3 6 n 3 8 n 3 6 n 3 7 n 3 r r r r r r s s s s x 3 x 3 x 3 f f 3 i 3 3 f 6 r i 1 s 5 n 3 6 n 3 7 n 3 r r r s s s x 3 x 3 f 1 i Nelson Freire (ISEP–DEI-APROG 2012/13) 6 3 n 3 6 x 2 6 6 s s x 2 x 2 f 1 f 2 i 2 i 1 7 n 3 6 n 3 f r r i s s x 3 x 2 x 2 f 3 f 6 f 2 f 2 i 2 2 i 1 i 2 i 0 6 6 s 2 2 n 3 i Legenda: RA do módulo principal RA do factorial Alteração corrente S: Stack L: Linha do programa L 1/3 6 19/29 Gestão de Memória Mecanismo de Passagem de Parâmetros 2/3 Conclusões É passado para módulo chamado uma cópia do parâmetro actual Parâmetro Formal de Tipo Primitivo Passada cópia de um valor Módulo chamado não tem acesso ao parâmetro atual Alterações posteriores do parâmetro formal não afetam parâmetro actual Funciona apenas como parâmetro de entrada Exemplo RAM public class Exemplo{ public static void main(String[] args){ int c=0; m(c); System.out.println("C=" + c); } private static void m(int c){ c=1; } (do main) c ... (do m) c 0 Na chamada de m RAM (do main) c } // Programa escreve C=0 0 0 ... (do m) c 1 Na execução de m Nelson Freire (ISEP–DEI-APROG 2012/13) 20/29 Gestão de Memória Mecanismo de Passagem de Parâmetros 3/3 Conclusões (continuação) Parâmetro Formal de Tipo Não-Primitivo Passada cópia de uma referência Módulo chamado tem acesso ao parâmetro actual Alterações posteriores do parâmetro formal afetam parâmetro atual Pode funcionar como parâmetro de entrada e saída Classe String é excepção Chamadas a módulos têm custos de desempenho Porque é preciso Criar e eliminar registo de activação Copiar parâmetros atuais Criação de módulos é um compromisso entre Facilidade de desenvolvimento Desempenho do programa Nelson Freire (ISEP–DEI-APROG 2012/13) 21/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 22/29 Tipos de Módulos Linguagem Java Tipos de Módulos Classe // modularidade ao nível do programa Método // modularidade dentro da classe Estrutura Geral de Programa Modular Programação Orientada por Objetos Ordem de métodos dentro de uma classe é arbitrária Método 1 Método 2 Classe 1 Método n Programa Método 1 Método 2 Método main Nelson Freire (ISEP–DEI-APROG 2012/13) Classe Principal Main Class 23/29 Linguagem Java Tipos de Métodos Método de uma Classe É uma sequência de instruções que realizam uma tarefa específica e no final pode retornar: Um valor // Função do algoritmo ou Nada (tipo void) // Procedimento do algoritmo Tipos de Métodos Métodos de instância Construção de um Objeto Métodos de classe Métodos de Instância Aplicam-se aos objetos da classe ( Ex: Scanner ler = new Scanner(System.in); String s = ler.next(); ) Declarados como métodos não estáticos (static) ( Ex: public String next() { ... } ) Métodos de Classe Aplicam-se à classe ( Ex: JOptionPane.showInputDialog(“N?”) ) Declarados como métodos estáticos ( Ex: public static showInputDialog(String s) { ... } ) Nelson Freire (ISEP–DEI-APROG 2012/13) 24/29 Linguagem Java Métodos de Classe Tipos Função Procedimento Declaração Tipo Procedimento modificador_acesso static void nome(tipo pf1, tipo pf2, ...., tipo pfn){ // corpo do método } Tipo Função modificador_acesso static tipo_retornado nome(tipo pf1, tipo pf2, ...., tipo pfn){ // corpo do método return expressão; } ≠ void Nota Cabeçalhos com static Nelson Freire (ISEP–DEI-APROG 2012/13) 25/29 Métodos de Instância Linguagem Java Tipos Função Procedimento Declaração Tipo Procedimento modificador_acesso void nome(tipo pf1, tipo pf2, ...., tipo pfn){ // corpo do método } Tipo Função modificador_acesso tipo_retornado nome(tipo pf1, tipo pf2, ...., tipo pfn){ // corpo do método return expressão; } Nota ≠ void Cabeçalho sem static Nelson Freire (ISEP–DEI-APROG 2012/13) 26/29 Modularidade Sumário Introdução Noção de Modularidade Execução de Programa Modular Motivações para Usar Formas de Comunicação entre Módulos Variáveis Globais Passagem de Parâmetros Algoritmia Tipos de Módulos Função Procedimento Algoritmo Modular Estrutura Geral Comunicação entre Módulos Gestão de Memória Linguagem Java Tipos de Módulos Classe Método Classe Instância Codificação de Algoritmo Modular em Java Nelson Freire (ISEP–DEI-APROG 2012/13) 27/29 Codificação de Algoritmo Estrutura Básica do Programa Pseudo-Código (Algoritmia) Linguagem Java Estrutura Geral de Algoritmo Modular Programação Procedimental Procedimento 1 Não é Programação Orientada por Objetos Método 1 Função 1 Método 2 Módulo Principal Método main Classe Principal (Main Class) Todos Métodos de Classe (Estáticos) Porque método estático só pode invocar diretamente métodos estáticos Nelson Freire (ISEP–DEI-APROG 2012/13) 28/29 Codificação de Algoritmo Codificação dos Módulos do Algoritmo Procedimento private static void nome (..., tipo nome_parâmetro_formal, ...){ // corpo do procedimento } Função private static tipo_retornado nome (..., tipo nome_parâmetro_formal, ...){ // corpo do método return expressão; } Modificadores de Acesso private // método só pode ser chamado por métodos da própria classe public // método pode ser chamado também por métodos de outras classes Sem modificador // método pode ser chamado também por métodos de classes da mesma package // Daí designado modificador de acesso package Nelson Freire (ISEP–DEI-APROG 2012/13) 29/29