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