Nelson Freire (ISEP–DEI-APROG 2012/13) 1/29
Modularidade
Algoritmia e Java
Nelson Freire (ISEP–DEI-APROG 2012/13) 2/29
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) 3/29
Mecanismo fornecido pelas Linguagens de Programação ...
... que permite decomposição dum programa em módulos Estrutura Geral de um Programa Modular
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
Módulo 1 Módulo 2 Módulo 3
Módulo Principal
Nelson Freire (ISEP–DEI-APROG 2012/13) 4/29 instrução 1 instrução i instrução i+1 instrução n instrução 1 instrução m Módulo Principal ou Outro Módulo Módulo Chamada Retorno
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
Nelson Freire (ISEP–DEI-APROG 2012/13) 5/29
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 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
Introdução
Motivações para Usar
desenvolvimento de programas Decomposição Reutilização Programa Módulo 1 Módulo 2 Módulo 4 Módulo Principal Módulo 3 ) ! )! ( ! ( p p n n n p C )) ( 2 ) ( 1 ) ( (g x f x f x
Nelson Freire (ISEP–DEI-APROG 2012/13) 6/29
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) 7/29
Variáveis Globais
Passagem de Parâmetros
Comunicação
entre Módulos
Formas
Módulo 1
Módulo Principal Módulo n
Nelson Freire (ISEP–DEI-APROG 2012/13) 8/29
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
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
Módulo 1
Módulo Principal
Declaração de Variáveis Globais
Módulo n
Comunicação
Nelson Freire (ISEP–DEI-APROG 2012/13) 9/29
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
Vantagens
Módulos são independentes // caixas negras
Facilitam desenvolvimento e testes dos programas Módulo 1 Variáveis Locais
Módulo Principal
Módulo n Variáveis Locais Variáveis Locais ComunicaçãoNelson Freire (ISEP–DEI-APROG 2012/13) 10/29
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
Dados Resultados
Módulo que Chama Módulo Chamado
Parâmetros Formais
Módulo
Parâmetros Actuais
Comunicação
Nelson Freire (ISEP–DEI-APROG 2012/13) 11/29
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) 12/29
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
Programa
Principal
Função 1
Nelson Freire (ISEP–DEI-APROG 2012/13) 13/29
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
Função
1/2
Nelson Freire (ISEP–DEI-APROG 2012/13) 14/29
Declaração Sintaxe
DEFINIR tipo_retornado nome (tipo pf1, ..., tipo pfn) // cabeçalho ED // variáveis e constantes locais (*)
INÍCIO
// corpo da função
RETORNAR expressão_do_tipo_retornado (**) FDEF
Exemplo
DEFINIR INTEIROfuncao(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: nome(pa1,pa2, ..., pan)
Exemplo: resultado 5 + funcao(23, 2)
• 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
• Lista de parâmetros actuais (argumentos) • Coincidem em número e tipo com os pf
• Inicializam os parâmetros formais com uma cópia
(*)
• Têm âmbito local
• Só visíveis dentro da função
• Só existem durante execução da função
Função
2/2
Algoritmia
(**)
• Só pode retornar 1 valor • Termina execução da função
Nelson Freire (ISEP–DEI-APROG 2012/13) 15/29
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) Algoritmia
Procedimento
Nelson Freire (ISEP–DEI-APROG 2012/13) 16/29 //Programa Principal
ED // declarações de variáveis e constantes locais INÍCIO
// Corpo do programa principal FIM
// Procedimento
DEFINIR nomeProcedimento(lista_parâmetros_formais) // cabeçalho ED // declarações de variáveis e constantes locais
INÍCIO
// corpo do procedimento FDEF
// Função
DEFINIR tipo_de_valor_retornado nomeFunção(lista_parâmetros_formais) // cabeçalho ED // declarações de variáveis e constantes locais
INÍCIO
// corpo da função contendo a instrução RETORNAR FDEF
Ordem dos módulos é arbitrária
Nelson Freire (ISEP–DEI-APROG 2012/13) 17/29
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) 18/29
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 Stack
Guarda dados do programa
Sempre que é chamado um módulo
É adicionado um segmento de memória, chamado registo de activação (RA)
O RA serve para guardar os parâmetros formais e as 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
O EP é colocado a apontar para a sua posição anterior Registos
Para guardar temporariamente endereços e dados
... Registos ... Program Counter Environment Pointer (EP) Código ... Dados Stack Gestão de
Nelson Freire (ISEP–DEI-APROG 2012/13) 19/29 // 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
f 1
PARA (ix ATÉ 1 PASSO -1) FAZER f f * i FIMPARA RETORNAR f FIMDEFINIR L 1 2 3 5 6 7 8 S L n r s S L 3 n 7 r 3 x 6 s f 2 i S L RA do factorial RA do módulo principal Legenda: Alteração corrente S: Stack L: Linha do programa 3 n 2 r s 3 x f i 3 n 5 r s 3 x 1 f i 3 n 6 r s 3 x 1 f 3 i i 3 n 7 r 3 x 3 3 s f 3 S L 3 n 5 6 r 2 x 1 s f i 3 n 6 6 r s 2 x 1 f 2 i S L 3 n 1 r s S L 3 n 8 6 r 2 s 3 n 6 6 r 2 x 2 s f 1 i 3 n 7 r 3 x 6 s f 1 i 3 n 6 r 3 x 6 s f 1 i S L 3 n 6 r 3 3 s 2 2 x f i 3 n 6 r 3 x 6 s f 0 i 3 n 8 6 r s 3 n 7 6 r 2 x 2 s f 1 i 3 n 7 6 r 2 x 2 s f 2 i 3 n 6 6 r 2 x 2 s f 0 i 3 n 3 6 r 2 x s f i
Mecanismo de Passagem de Parâmetros
1/3
Gestão de Memória
Nelson Freire (ISEP–DEI-APROG 2012/13) 20/29
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
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; } } // Programa escreve C=0 RAM (do main) c 0 0 ... (do m) c RAM (do main) c 0 1 ... (do m) c Na chamada de m Na execução de m
Mecanismo de Passagem de Parâmetros
2/3
Gestão de Memória
Nelson Freire (ISEP–DEI-APROG 2012/13) 21/29
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
Mecanismo de Passagem de Parâmetros
3/3
Gestão de Memória
Nelson Freire (ISEP–DEI-APROG 2012/13) 22/29
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) 23/29
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
Classe 1 Classe Principal Main Class Método 1 Método 2 Método n Método 1 Método 2 Método main Programa
Nelson Freire (ISEP–DEI-APROG 2012/13) 24/29
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 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) { ... } ) Construção de
um Objeto
Nelson Freire (ISEP–DEI-APROG 2012/13) 25/29 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; }
Nota
Cabeçalhos com static
≠ void
Nelson Freire (ISEP–DEI-APROG 2012/13) 26/29 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
Cabeçalho sem static
Linguagem Java
Métodos de Instância
Nelson Freire (ISEP–DEI-APROG 2012/13) 27/29
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) 28/29
Linguagem Java
Pseudo-Código (Algoritmia)
Estrutura Geral de Algoritmo Modular Programação Procedimental Procedimento 1
Módulo
Principal
Função 1 Classe Principal (Main Class) Não é Programação Orientada por ObjetosMétodo 1
Método 2
Método main
Todos Métodos de Classe (Estáticos)
Porque método estático só pode invocar diretamente métodos estáticos
Codificação de
Nelson Freire (ISEP–DEI-APROG 2012/13) 29/29 private static tipo_retornado nome (..., tipo nome_parâmetro_formal, ...){ // corpo do método
return expressão; }
private static void nome (..., tipo nome_parâmetro_formal, ...){ // corpo do procedimento
} Procedimento
Função
Codificação de
Algoritmo
Codificação dos Módulos do Algoritmo
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