Aula 19 Estrutura de Funções - 1inf1301/docs/INF1301_Aula20_E... · 1 Aula 19 Estrutura de...
Transcript of Aula 19 Estrutura de Funções - 1inf1301/docs/INF1301_Aula20_E... · 1 Aula 19 Estrutura de...
1
Aula 19Estrutura de Funções - 1
Alessandro GarciaAlessandro GarciaLES/DI/PUC-Rio
Maio 2010
Avisos
• No fim da aula– entrega da prova corrigida e nota
• Trabalhos
– T3: enunciado está disponível• como já sabem: basicamente, completar o projeto e
implementação do jogo de damas
• entrega: 9 de junho
Maio 2009 2 / 32Alessandro Garcia © LES/DI/PUC-Rio
– T2: notas disponíveis até este sábado
2
Especificação
• Objetivo dessa aula– Examinar em detalhe propriedades estruturais e interfaces
entre funções...• ... não discutidas até aqui:
– Ex.: tratamento de exceções e respectivos acoplamentos entre funções
• Referência básica:– Capítulo 8
Maio 2009 3 / 32Alessandro Garcia © LES/DI/PUC-Rio
Sumário
• Especificação de funções– especificação do acoplamento de funções
• Exemplos de especificação
• Acoplamento excepcional de funções– Condições de retorno (em C) vs.
– Mecanismos dedicados para tratamento de exceções
• Finalização, arrumação da casa
• O grafo estrutura de funções– Para que serve?
Maio 2009 4 / 32Alessandro Garcia © LES/DI/PUC-Rio
– Para que serve?
3
Definições básicas
• Função é uma porção auto-contida de código que:– possui um nome que pode ser chamado (ativado) de diversos
lugares
– pode retornar zero ou mais valores
– pode depender de e alterar zero ou mais parâmetros
– pode alterar zero ou mais valores do estado do módulo• variáveis internas
• variáveis globais
– pode criar, ler e destruir arquivos, etc...
Maio 2009 5 / 32Alessandro Garcia © LES/DI/PUC-Rio
• Funções e métodos em linguagens OO são basicamente à mesma coisa
Especificação de uma função - I
• Comentário: objetivo da função– define o objetivo principal, sem mencionar ações
complementaresse idêntico ao nome da função deve ser omitido o comentário– se idêntico ao nome da função deve ser omitido o comentário
• Acoplamento– identifica todos os itens da interface e respectivos tipos
• não somente os elementos da assinatura
– são exemplos de itens do acoplamento• parâmetros recebidos• parâmetros retornados (chamada por referência)
Maio 2009 6 / 32Alessandro Garcia © LES/DI/PUC-Rio
• valores retornados, condições de retorno• dados globais recebidos e/ou retornados• arquivos manipulados• exceções sinalizadas (throw)• cancelamentos realizados – exit( num )
4
Controle da execução de funções
• Condição de retorno– é um valor retornado por uma função indicando o estado final
de seu funcionamento
– exemplos:• CondRetOK - processamento normal
• CondRetErroDado - dados fornecidos fora de sua especificação
• CondRetErroPrecisao - não se atingiu a precisão requerida
– pode ser retornado • como valor retornado
– é o padrão que procuramos utilizar
Maio 2009 7 / 32Alessandro Garcia © LES/DI/PUC-Rio
p q p
• como valor retornado através de parâmetro passado por referência
• como valor de variável global– evitem essa solução
condições Excepcionais (exceções)
Especificação de uma função - I
• Comentário: objetivo da função– define o objetivo principal, sem mencionar ações
complementaresse idêntico ao nome da função deve ser omitido o comentário– se idêntico ao nome da função deve ser omitido o comentário
• Acoplamento– identifica todos os itens da interface e respectivos tipos
• não somente os elementos da assinatura
– são exemplos de itens do acoplamento• parâmetros recebidos• parâmetros retornados (chamada por referência)
Maio 2009 8 / 32Alessandro Garcia © LES/DI/PUC-Rio
• valores retornados, condições de retorno• dados globais recebidos e/ou retornados• arquivos manipulados• exceções sinalizadas (throw)• cancelamentos realizados – exit( num )
5
Especificação de uma função - II
• Acoplamento – conjunto de exceções sinalizadas– em C: condições de retorno excepcionais
TratadorE1
TratadorE2
TratadorE3Função
Chamadas
Maio 2009 9 / 32Alessandro Garcia © LES/DI/PUC-Rio
– exemplos: nome de arquivo não existe, índice/chave fora do limite, conexão com servidor/banco-dados não pode ser estabelecida, etc...
Chamadas
Especificação de uma função - III
• Acoplamento – conjunto de exceções sinalizadasexemplos de tratadores...
– recuperação por retrocesso: o tratador desfaz modificações nas variáveis locais e retorna um resultado indicando insucesso na operação p ç
– fechamento: o tratador garante que uma conexão/arquivo aberta(o) seja fechada(o)
– notificação ao usuário: nenhuma recuperação, somente notifica ao usuário que uma exceção ocorreu
– armazenamento de erro: criação de registro de erro em arquivo especial
– re-sinaliza uma exceção diferente... Para a função chamadora
– nova tentativa: a mesma função ou uma diferente implementação
Maio 2009 10 / 32Alessandro Garcia © LES/DI/PUC-Rio
o a a u ção ou u a d p ação(daquela função) é invocada
• é usada em técnicas como bloco de recuperação ou programação N-Versões
– tratador vazio: “silencia” a exceção – má pratica e deve ser evitado
– assert: o tratador desempenha algum tipo de operação de assert; quanto a assertiva não é válida, isto resulta em uma nova exceção, possivelmente levando ao término da execução do programa
6
Exemplo de condição de retorno
• Servidortypedef enum {
CondRetLeuOK , /* Leitura normal */CondRetLeuEOF , /* Encontrou fim de arquivo antes de ler */CondRetLe Erro /* Ocorre erro de leit ra */CondRetLeuErro /* Ocorreu erro de leitura */
} tpCondRetLeu ;
. . .
tpCondRetLeu LerReg( FILE * pArq , tpReg * pReg ){
if ( feof( pArq )){
memset( pReg , 0xFF , sizeof( tpReg )) ;return CondRetLeuEOF ;
} /* if */
Maio 2009 11 / 32Alessandro Garcia © LES/DI/PUC-Rio
Conta = fread( pReg , pArq , sizeof( tpReg ) , 1 ) ;if ( ( ferror( pArq ) != 0 ) || ( Conta != 1 )){
memset( pReg , 0xCC , sizeof( tpReg )) ;return CondRetLeuErro ;
} /* if */return CondRetLeuOK ;
} /* Função LerReg */
Exemplo de condição de retorno
• A função cliente contém o código:
Cond = LerReg( pArqA , pBuffer ) ;switch ( Cond ){
case CondRetLe OKcase CondRetLeuOK :/* código que trata o caso de leitura normal */break ;
case CondRetLeuEOF :/* código que trata o caso de fim de arquivo */break ;
case CondRetLeuErro :printf( "\nErro de leitura no arquivo: %s código \'C\' %c" ,
NomeArqA , errno ) ;printf( "\nPrograma será cancelado" ) ;Finalizar( 4 ) ;
Maio 2009 12 / 32Alessandro Garcia © LES/DI/PUC-Rio
default:printf( "\Erro de execução: LerReg condição desconhecida: %i" ,
Cond ) ;printf( "\nPrograma será cancelado" ) ;Finalizar( 4 ) ;
} /* fim switch */
o break é desnecessário, pois Finalizar( )não retorna
7
Controle da execução de funções
• Problemas do idioma de tratamento de exceções em C:– sinalização da exceção não é explícita – usa-se return
– overhead em criação de enumerações para cada módulo• assinatura da função não indica explicitamente quais exceções são
levantadas por aquela função
– não existe separação explícita do código de tratamento da exceção (uso de switch ou if)
– o programa não é desviado explicitamente do fluxo normal até que um switch seja encontrado
• Exceções em C++ Java e C#
Maio 2009 13 / 32Alessandro Garcia © LES/DI/PUC-Rio
• Exceções em C++ , Java e C#– é uma condição de término especial indicando a ocorrência de
uma anormalidade no processamento. Exemplos:• falta de memória
• erro de dispositivo
– utiliza estruturas de tratamento de exceções: try ... catch
Tratamento de Exceções: Origem
GoodenoughEH NotationPL/I
ON statements
indicação de ocorrência de exceçãoassociação do tratador
1971
Parnas & Dijkstra
1975 1979
CLUDeclaração explícita
De interface excepcional
1980
1964
Nelio Cacho
Parnas & DijkstraPrincípio de
Encapsulamento eSeparação de Interesses Tratamento de Exceções
em Linguagens Modernas
8
Especificação de uma função - IV
• Comportamento exceptional de funções – diferente de C, C++ e Java provêem suporte explícito a
tratamento de exceções
Facilidades / Mecanismos paraTratamento de Exceções
ExceçõesTratadores(Handlers)
Desvio do Fluxo e Buscade Tratadores
Maio 2009 15 / 32Alessandro Garcia © LES/DI/PUC-Rio
Definição de “RegiõesProtegidas”
InterfacesExcepcionais
Especificação de uma função - V
• Acoplamento – conjunto de exceções sinalizadas– exceções são levantadas/sinalizadas explicitamente em C++
int funcaoX ( ...) {
// código desprotegido
try {
// código a ser tentado; região protegida
if (x > 10) {throw excecao};
}
catch (tipo excecao)
{acoplamento:
exceção
Maio 2009 16 / 32Alessandro Garcia © LES/DI/PUC-Rio
{
// código do tratador: a ser executado// em caso de exceção
if (x > 10) {throw excecao2};
}
}
exceçãosinalizada
9
Especificação de uma função - VI
• Acoplamento – conjunto de exceções sinalizadas– exceções são sinalizadas explicitamente em Java
class Count {
acoplamento:exceção
sinalizada
class Count {
public static void main(String args[]) throws java.io.IOException
{
int count = 0;
while (System.in.read() != -1)
count++;
System.out.println("Entrada:"+count+ "caracteres.");
}
Maio 2009 17 / 32Alessandro Garcia © LES/DI/PUC-Rio
}
}
Especificação de uma função - VII
• Acoplamento - cancelamentos realizados – exit( num )
int soma(int a, int b) {int resultado;resultado = a + b;/* "exit" encerra o programa imediatamente e retorna* "resultado" para o sistema operacional */p p /
exit(resultado);}
int main() {int nr1,nr2,valor;printf("Entre com o valor do primeiro número :");scanf("%d",&nr1);printf("Entre com o valor do segundo número :");scanf("%d",&nr2);
/* Chamando a função soma. O comando "return"* da função soma retornará "resultado" para* aqui. */
Maio 2009 18 / 32Alessandro Garcia © LES/DI/PUC-Rio
printf("A soma dos dois é %d\n", soma(nr1,nr2));
/* Nada abaixo disto será executado pois o comando "exit"* chamado na função "soma" acima encerrará imediatamente* o programa e retornará "resultado" para o sistema operacional*/
printf("Entre com o valor a ser retornado para o sistema operacional :");scanf("%d",&valor);...return(valor);
}
10
Arrumação da casa: finalização do programa
• Ao terminar a execução de um programa todos os recursos alocados neste programa devem ser liberados, independentemente de como foi terminado o programa
• Exemplos:– arquivos abertos
– memória alocada
• Deve ser restaurado estado do sistema para o que era antes de iniciar a execução do programa
Maio 2009 19 / 32Alessandro Garcia © LES/DI/PUC-Rio
• try-catch-finally em Java: código de arrumação da casa para cada função/método
Arrumação da casa: finalização
• Assegurar a liberação de recursos alocados é particularmente complexo quando o programa utiliza funções de finalização capazes de cancelar a execução
• Pode-se utilizar um módulo de arrumação da casa(housekeeping), ou de finalização para ajudar a resolver
• De qualquer maneira é necessária disciplina ao programar
Maio 2009 20 / 32Alessandro Garcia © LES/DI/PUC-Rio
11
Especificação de uma função - VIII
– Impacto em Assertivas de saída (Pós-condição)• estabelece as condições que dados, estados e arquivos devem
satisfazer ao terminar a execução da função
• a assertiva de saída deve valer para todas as formas de saída• a assertiva de saída deve valer para todas as formas de saída(condições de retorno), mesmo que terminado de forma “excepcional”
• cancelamento (exit( num )) deve ser explicitado indicando o que significa cada valor de num retornado pelo programa
– De maneira geral as funções devem satisfazer também as assertivas invariantes do módulo (assertivas estruturais)
t ã d fi id í l d ód l id d i
Maio 2009 21 / 32Alessandro Garcia © LES/DI/PUC-Rio
• estas são definidas no nível do módulo e assumidas e deveriam ser válidas ao entrar e ao sair da função
Especificação do acoplamento/interface
• Interface conceitual– é a definição da interface de uma função sem preocupação com
a sua implementação
Exemplo– Exemplo
InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela, tpIdSimb IdSimbolo, tpCondRet CondRet
• Interface física– é a implementação da interface conceitual, determinando a
forma de realizar fisicamente a interface conceitual• identificação dos parâmetros
Maio 2009 22 / 32Alessandro Garcia © LES/DI/PUC-Rio
• identificação dos parâmetros
• identificação dos dados globais
• identificação dos dados persistentes (arquivos)
– Exemplo, considerando a existência de uma única tabela global static
tpIdSimb InserirSimbolo( tpSimbolo Simbolo )
12
Especificação do acoplamento / interface
• Interface implícita (relacionadas à interface física)– é formada pelos itens da interface diferentes de parâmetros e
valor de retorno• dados globais
• arquivos
• interface com o usuário
InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela, tpIdSimb IdSimbolo, tpCondRet CondRet
Interface conceitual
Maio 2009 23 / 32Alessandro Garcia © LES/DI/PUC-Rio
p , p , p
tpIdSimb InserirSimbolo( tpSimbolo Simbolo )Interface física Interface implícita
Interface explícita
Especificação do acoplamento: notação
• 1. De forma visual, tais como: modelo de componentes– comentários podem ser usados para indicar dados resultantes ou
modificados
• 2. Interface em notação similar a uma linguagem de programação– listam-se como parâmetros todos os dados ao entrar
• independentemente se serão explícitos ou implícitos
• sem se preocupar com a forma de realizar– por exemplo: diz-se Tabela ao invés de pTabela, mesmo se fisicamente a tabela
será identificada por um ponteiro para a sua cabeça
– listam-se como saída todos os dados resultantes ou modificados
Maio 2009 24 / 32Alessandro Garcia © LES/DI/PUC-Rio
– exemplo
InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela , tpIdSimb IdSimbolo ,
tpCondRet CondRet
13
Especificação do acoplamento: notação
• 3. Texto explanatório, separando entrada e saída
InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela, tpIdSimb IdSimbolo, tpCondRet CondRet
Recebe dadosTabela - Tabela em que será inserido o símboloSimbolo - Símbolo válido a inserir
Produz resultadosSe não ocorreu erro
Se o símbolo era novo:Cria um idSimbolo diferente dos existentesTabela acrescida do par < idSimbolo, Simbolo >
Se o Simbolo já existia
Maio 2009 25 / 32Alessandro Garcia © LES/DI/PUC-Rio
Tabela inalteradaFimSeidSimbolo o id associado ao Simbolo
Se ocorreu erro: Tabela inalteradaidSimbolo = NIL_SIMBOLO
FimSeCondRet ver tipo tpCondRetTabela
Estrutura de funções
• A estrutura estática de funções é um grafo dirigido– os vértices são os nomes de funções
– as arestas: existe uma aresta de cada função F para cada uma das funções que pode ser chamada pelo código do corpo de F
– origem: no caso de um programa a origem do grafo é a função main( )
F5 F6F1
F2
MÓDULO 1 MÓDULO 3
F8F9
Maio 2009 26 / 32Alessandro Garcia © LES/DI/PUC-Rio
F3 F4
F7
MÓDULO 2
F10
Acoplamentos de exceções tambémpodem ser representadas no grafo
14
Estrutura de funções
• A estrutura estática de funções é um grafo dirigido– os vértices são os nomes de funções
– as arestas: existe uma aresta de cada função F para cada uma das funções que pode ser chamada pelo código do corpo de F
– origem: no caso de um programa a origem do grafo é a função main( )
F5 F6F1
F2
MÓDULO 1 MÓDULO 3
F8F9
e1 -> e2
Maio 2009 27 / 32Alessandro Garcia © LES/DI/PUC-Rio
F3 F4
F7
MÓDULO 2
F10
Acoplamentos de exceções tambémpodem ser representadas no grafo
e1
Estrutura de funções
• A estrutura estática de funções é um grafo dirigido– os vértices são os nomes de funções
– as arestas: existe uma aresta de cada função F para cada uma das funções que pode ser chamada pelo código do corpo de F
– origem: no caso de um programa a origem do grafo é a função main( )
F5 F6F1
F2
MÓDULO 1 MÓDULO 3
F8F9
e5,e6,e7,e8,e9,e10
Maio 2009 28 / 32Alessandro Garcia © LES/DI/PUC-Rio
F3 F4
F7
MÓDULO 2
F10
Fraco acoplamento normal (falso positivo)Forte acoplamento excepcional
15
Estrutura de funções : exemplo 2 / 2
• arco de chamadas: é um fragmento de caminho conexo no grafo estrutura de funções
• um arco de chamadas pode ser recursivo– direto: F4 -> F4
– indireto: F9 -> F8 -> F3 -> F5 -> F9
• podem existir funções mortas, ex: F10
• pode existir dependênciacircular entre módulossem que isto F5 F6
F1
MÓDULO 1 MÓDULO 3
Maio 2009 29 / 32Alessandro Garcia © LES/DI/PUC-Rio
configure uma recursão:F8 -> F3 -> F5 -> F6 -> F7
F3 F4
F2
F7
MÓDULO 2
F8F9
F10
Correção da Prova
• Questão 3– A) bastava indicar um conjunto de módulos da arquitetura do
sistema para o problema de César• exemplos de módulos: Sorteio, Soldados, Problema_César,
Interface, etc…
• Foi pedido modelo conceitual da arquitetura– logo, era necessário usar o diagrama que vocês usaram no trabalho
» interfaces e relacionamentos
» não era obrigatório detalhar as interfaces, bastava indicar quais módulos usavam as interfaces de quais outros módulos
» não era para representar a Lista ou Lista Circular neste modelop p
– quem apresentou meramente um modelo conceitual do domínio do problema
» eu considerei parte da questão
Maio 2009 30 / 32Alessandro Garcia © LES/DI/PUC-Rio
16
Correção da Prova
• Questão 3– B) era para representar o modelo físico de uma lista circular
genérica• … e não específica para representar o problema (círculo de
soldados) – logo:– nao tinha tamanho fixo
– e o tipo do valor poderia ser qualquer (void*)
– poderia ser tanto encadeada quanto duplamente encadeada
• E também não era para esquecer de:– representar a cabeça da estrutura
– e assertiva que não existe qualquer elemento que aponta para nulo (já e assertiva que não existe qualquer elemento que aponta para nulo (já que uma lista circular não tem fim)
» caso contrário: o modelo poderia estar representando qualquer tipo de lista encadeada
– cabeça de lista circular só precisa indicar o nó corrente, já que nao tem início e fim (representa um círculo)
Maio 2009 31 / 32Alessandro Garcia © LES/DI/PUC-Rio
Correção da Prova
• Questão 3– C) era para representar o exemplo físico da lista circular para
o problema• … após a remoção de X:
– corrente deveria apontar para Y
– somente cinco elementos
• A instância da cabeça também deveria ser representada
• Valores nos nós/elementos (T, U, etc…) deveriam aparecer, assim como todos os ponteiros
Maio 2009 32 / 32Alessandro Garcia © LES/DI/PUC-Rio
17
Correção da Prova
• Questão 3– D) exemplos de assertivas para função de sorteio
• N tem que ser inteiro
• N>1, ou N>=1
• Não pode ser sorteado soldado que já foi removido
• O nome do sorteado deve fazer parte do conjunto de nomes na lista completa/inicial
• pLista tem que ser diferente de nulo, etc….
• Erros clássicos:– Assertivas que não estavam relacionadas com a função de sorteio
– Ex.: função de remoção é diferente de função de sorteio
» além de problema de coesão
» era dito no enunciado!
Maio 2009 33 / 32Alessandro Garcia © LES/DI/PUC-Rio
Correção da Prova
• Questão 4– A) os comandos de teste eram os mesmos de uma lista
encadeada• =incluir, =destruir, =inserir, =remover, =obterValor, etc…
• era necessário definir os parâmetros de cada comando e as possíveis condições de retorno
• exemplos não eram suficientes
– B) Não, nem todos casos de teste devem ser reutilizados pois, por exemplo:
• não faz sentido executar casos de teste associados com fim de lista (não existe em lista circular)
Maio 2009 34 / 32Alessandro Garcia © LES/DI/PUC-Rio
18
FIM
Maio 2009 35 / 32Alessandro Garcia © LES/DI/PUC-Rio