Estrutura de funções I - 1
Estruturas de funções I
Aula 13
Agenda
• Especificação de uma função
• Estrutura de chamada de funções
• Condições de retorno
• Funções de arrumação
Objetivo
Apresentar os conceitos relativos a interfaces de funções.
Referência
Capítulo 8
© AvS
Aula13-EstruturaFuncoes-i-2006-1.doc
05-Apr-2006
Estrutura de funções I - 2
Modos de organizar programas - paradigmas
Verbete: paradigma
1. Modelo, padrão, estalão:
Paradigma de programação
• é um modelo ou forma de organizar programas
Paradigma procedural
• programas são modelados segundo estruturas de chamada de funções
• freqüentemente cada função é um módulo (ex. FORTRAN)
• tende a gerar um volume grande de dados globais externos (COMMON)
• encapsulamento é virtualmente impossível
Paradigma orientado a objetos
• programas são modelados segundo tipos abstratos de dados ou de classes
de objetos
• pode-se encapsular os dados e as funções de apoio
• pode-se manipular instâncias de estruturas de dados (objetos)
Paradigma funcional
• programas são modelados segundo funções e associações de parâmetros,
ex. Scheme, Lisp
Outros
© AvS
Estrutura de funções I - 3
Estrutura de funções
© AvS
Estrutura de funções I - 4
Estrutura potencial de chamadas
Estrutura potencial de chamada
• definida pela relação função-chama-função
• estática
• todas as chamadas conhecidas em tempo de compilação
• dinâmica
• chamadas efetuadas e ainda ativas a cada momento da execução
• chamadas dinâmicas utilizam variáveis do tipo referência para
função
MÓDULO 1
MÓDULO 3
F1
F2
F5
F8
F6
F9
F7
MÓDULO 2
F3
F4
F10
• a figura mostra a estrutura potencial de chamadas, F1 é a origem
• arco de chamada: seqüência de chamadas realizadas e ainda ativas
• arco de chamadas recursivas indiretas: F9 -> F8 -> F3 -> F5 -> F9
• podem existir funções mortas ex: F10
• pode existir dependência circular entre módulos sem que isto configure
uma recursão: F8 -> F3 -> F5 -> F6 -> F7
© AvS
Estrutura de funções I - 5
Função
Uma função é uma porção de código contida em um espaço de dados,
• possui um nome
• possui uma assinatura
• valor retornado
• nome
• lista de parâmetros => tipos dos parâmetros
int Func( int , float )
• a assinatura está associada a um de possivelmente vários corpos (código)
• associação da implementação
• pode ser chamada (ativada) de diversos lugares
• na hora da chamada é estabelecida outra associação: a associação da
chamada
• estática (tempo de compilação), caso normal de linguagens procedurais
• dinâmica (tempo de execução), caso freqüente em linguagens
orientadas a objetos
• versionada - a associação pode depender da versão (DLL)
Assinatura
F( int )
Chama
F( float )
Associação
da chamada
Assinatura
Associação
da implementação
F( float )
Associação
da implementação
Corpo
F( float )
© AvS
Corpo
F( float )
Corpo
F ( int )
Estrutura de funções I - 6
Função
Uma função pode
• retornar zero ou mais valores
• receber zero ou mais parâmetros
• alterar zero ou mais parâmetros
• utilizar ou alterar zero ou mais estados
• variáveis membro de objetos
• variáveis membro de classes
• variáveis globais
• estados da plataforma de execução, exemplos:
• cursor ligado / desligado
• arquivo aberto / fechado
• arquivo existe / não existe
• janela: monitor inteiro / monitor parcial / minimizada
• criar, ler, alterar ou destruir zero ou mais arquivos
• alocar / solicitar ou desalocar / liberar recursos
• interagir com o usuário
• menus
• diálogos
• mensagens
• ...
Todos estes itens devem figurar na especificação da função
© AvS
Estrutura de funções I - 7
Especificação de uma função
Objetivo da função
• pode ser idêntico ao nome da função
Acoplamento
• identifica todos os itens da interface e respectivos tipos
Condições do acoplamento
• Pré-condição ⇔ assertiva de entrada
• estabelece as condições que dados, estados e arquivos devem
satisfazer imediatamente antes de iniciar a execução da função
• Pós-condição⇔ assertiva de saída
• estabelece as condições que dados, estados e arquivos devem
satisfazer ao terminar a execução da função.
Interface com o usuário
• todos os relatórios e mensagens (textos, sons, gráficos, animações, …)
enviadas para o usuário
• todos os dados e comandos recebidos do usuário
• restrito à função sendo observada, evitando funções chamadas por esta
função
Requisitos
• estabelecem as características e condições que a função deverá satisfazer
Hipóteses
• estabelecem as características e condições esperadas pela função
Restrições
• restringem a liberdade de escolha de projeto, implementação, ou controle da
qualidade
© AvS
Estrutura de funções I - 8
Exemplo de especificação de uma função
/*********************************************************************
*
* $FC Função: TBS Obter um string contido na tabela
*
* $ED Descrição da função
*
Procura a identificação de um string na tabela de strings.
*
Caso encontrado, copia-o para o espaço disponibilizado pelo
*
cliente.
*
Não sendo encontrado copia o string com idString == 1;
*
valor default:
*
"Identificação de string %d não foi encontrada."
*
*
Contido no arquivo de especificação de string:
*
DefinicaoDefault.defstr
*
*
Caso este também não seja encontrado, copia o string ERRO_STRING
*
definido neste módulo. Valor default:
*
"?!?!?"
*
* $EP Parâmetros
*
idString
- identifica o string a ser procurado na tabela
*
dimString
- é a dimensão máxima, incluindo o zero terminal,
*
que o string obtido poderá ter
*
pString
- ponteiro para espaço receptor do string com pelo
*
menos dimString bytes
*
* $FV Valor retornado
*
Ver especificações das condições de retorno
*
*********************************************************************/
TBS_tpCondRet TBS_ObterString( long
idString ,
int
dimString ,
char * pString ) ;
© AvS
Estrutura de funções I - 9
Pré e pós condições
Estabelecem as condições que dados e resultados devem satisfazer
Devem ser especificadas no acoplamento
• condições do acoplamento
Podem ser fatoradas se envolverem relações complexas
Exemplos de pré-condições:
Tabela
Simbolo
idSimbolo
contém 0 ou mais símbolos.
é uma seqüência de zero ou mais bytes quaisquer.
é um identificador em relação um para um com um símbolo
existente.
Exemplo de pós-condições:
Se CondRet == OK
Então
Tabela contém 1 ou mais símbolos
Se Simbolo já figurava na tabela
Então
idSimbolo é o valor associado ao Simbolo já existente na tabela
Senão
Terá sido criado um novo valor para idSimbolo diferente de todos
os demais identificadores registrados na tabela
Simbolo terá sido acrescentado à Tabela e associado ao idSimbolo
criado
FimSe
FimSe
Se CondRet != OK
Então
Tabela não terá sido alterada
idSimbolo será igual a NIL_SIMBOLO
FimSe
© AvS
Estrutura de funções I - 10
Especificação do acoplamento
Resumido, semelhante à programação
InserirSimbolo( Tabela, Simbolo ) ⇒ Tabela, IdSimbolo, CondRet
Por extenso separando entrada e saída
Inserir símbolo em uma tabela
Recebe dados
Tabela
- Tabela em que será inserido o símbolo
Simbolo
- Símbolo a inserir
Produz resultados
Tabela
- Se não ocorreu erro e se o símbolo era novo:
Tabela acrescida do símbolo
Se não ocorreu erro e o símbolo já existia,
ou se ocorreu erro: a tabela não terá
sido alterada
idSimbolo
- Se não ocorreu erro: é a identificação do
símbolo na tabela
Se ocorreu erro: é NIL_SIMBOLO
CondRet
- Condição de retorno: ver tpCondTabela
Por extenso, segundo o padrão de especificação no livro
Inserir símbolo em uma tabela
Tabela
ao entrar - Tabela em que será inserido o símbolo
ao sair
- Se não ocorreu erro e se o símbolo era novo:
Tabela acrescida do símbolo
Se
não ocorreu erro e o símbolo já existia,
ou se ocorreu erro:
a tabela não terá sido alterada
Simbolo
ao entrar - Símbolo a inserir
idSimbolo
ao sair
- Se não ocorreu erro:
é a identificação do símbolo na tabela
Se ocorreu erro:
é SIMBOLO_NIL
CondRet
ao sair
- Condição de retorno:
ver tpCondTabela
© AvS
Estrutura de funções I - 11
Interface com o usuário
Mensagens exibidas para o usuário
• mensagens de erro ou advertência
• mensagens de feedback ou de estado do processamento
• bolhas e mensagens de auxílio
Dados exibidos para o usuário
• valores
• tabelas
• relatórios
• diagramas
• figuras
• gráficos
• animações
• sinais sonoros
• ...
Dados recebidos do usuário
Comandos recebidos do usuário
• menus
• teclas
• ícones
• botões
• voz
• ...
Diálogos realizados com o usuário
Seleções diretas a partir de elementos na janela ativa
© AvS
Estrutura de funções I - 12
Estrutura do pseudo código de uma função
Crie uma estrutura de pseudo código para funções com algoritmos extensos
• primeiro crie a estrutura
• depois preencha o código
// Extrair palavras chave
// Criar a lista de palavras chave
// Ler primeiro caractere
// Gerar lista de palavras chave
while ( tem caractere )
{
// Processar caractere corrente
if ( Caractere é delimitador
&& Palavra chave vazia
)
{
// Marcar o início de nova palavra chave
} else if ( Caractere é delimitador
&& Palavra chave não está vazia )
{
// Registrar a palavra chave
} else if ( Caractere não é delimitador )
{
// Adicionar caractere à palavra
} else
{
// Sinalizar erro de lógica: condição impossível
} // if
// Ler próximo caractere
} // while
// Ordenar a lista de palavras chave
// Exibir a lista de palavras chave
© AvS
Estrutura de funções I - 13
Localizador
Localizador
• é um elemento de programa utilizado para localizar um elemento contido em
algum conjunto ou estrutura de dados
• identificador
• um valor em correspondência um para um com o elemento
procurado em memória
• chave
• um valor em correspondência um para um com o elemento
procurado em algum arquivo
• referência
• um nome ou localizador alternativo para o elemento a ser localizado
• ponteiro
• o endereço do elemento na memória
• função de acesso
• uma função que computa o endereço do espaço de dados a partir
de um ou mais parâmetros, exemplo
Exemplos
• idAluno identifica um determinado aluno no conjunto de todos os alunos
• Alunos{ idAluno }
• Em C: ObterAluno( pAlunos, idAluno )
• Em C++ ou Java: Alunos.ObterAluno( idAluno )
• Arv{ pNo }
• TabSimb{ Simbolo }.Valor
• *(TabSimb( Simbolo )).Valor
• ArquivoX{ Chave }
=> estrutura de pesquisa, ex.: BTREE
• ArquivoX{ inxRegistro }
=> função fseek(...)
• ArquivoX{ inxRegistro }
=> <drive, cilindro, trilha, setor>
© AvS
Estrutura de funções I - 14
Conceitos básicos relacionados com funções
Condição de retorno
• é um valor retornado por uma função indicando o estado final de seu
funcionamento. Exemplos:
• OK
processamento normal
• ERRO_DADO
dados fornecidos for a de sua especificação
• ERRO_PRECISAO
não se atingiu a precisão requerida
Exceção
• é uma condição de término especial indicando a ocorrência de uma
anormalidade no processamento. Exemplo:
• falta de memória
• erro de dispositivo
• deve ser tratada através de tratamento de exceções: try ... catch
Run-time
• é a definição e implementação da máquina virtual necessária para executar
os programas
• passagem de parâmetros
• retorno de valores
• retorno de condições de exceção
• como é realizada a amarração dinâmica
Amarração
• (binding) é a associação de um nome ao seu espaço de dados
• vinculação da assinatura de uma função a uma de suas implementações
• vinculação do nome da função sendo chamada com a respectiva
assinatura
• pode ocorrer de forma estática
• a mesma implementação vinculada ao nome é chamada sempre
• pode ocorrer de forma dinâmica
• escolhe-se a implementação em função do estado da execução e/ou da
assinatura a cada vez que a chamada for realizada
© AvS
Estrutura de funções I - 15
Conceitos básicos relacionados com funções
Interface conceitual
• definição da interface de uma função sem preocupação com a sua
implementação
• é tipicamente a especificação
InserirSimbolo( Tabela, Simbolo ) ⇒ Tabela, IdSimbolo, CondRet
Interface física
• é a implementação da interface conceitual, determinando a forma de realizar
fisicamente a interface conceitual
• identificação dos parâmetros
• identificação dos dados globais
• identificação dos dados persistentes (arquivo)
tpIdSimbolo InserirSimbolo( tpSimbolo Simbolo)
Tabela global estático do módulo
CondRet - exceção
Interface implícita
• é formada pelos dados da interface diferentes de parâmetros e valor de
retorno
• dados globais
• estados
• arquivos
• interface com o usuário
Estabelecimento das interfaces
• declaração
=> protótipo
• definição
=> cabeçalho
• parâmetro formal => parâmetro
• implementação
=> corpo da função
• chamada da função
• parâmetro atual => argumento
© AvS
Estrutura de funções I - 16
Condições de retorno e tratamento de exceção
typedef enum
{
Leu_OK ,
Leu_EOF ,
Leu_Erro
} tpLeu ;
. . .
/* Leitura normal */
/* Encontrou fim de arquivo antes de ler */
/* Ocorreu erro de leitura */
tpLeu LerReg( FILE * ptArq ,
tpReg * ptReg
)
{
if ( feof( ptArq ))
{
memset( ptReg , 0xFF , sizeof( tpReg )) ;
return Leu_EOF ;
} /* if */
fread( ptReg , ptArq , sizeof( tpReg ) , 1 ) ;
if ( ioError != OK )
{
memset( ptReg , 0xFF , sizeof( tpReg )) ;
return Leu_Erro
} /* if */
return Leu_OK ;
} /* Função LerReg */
A função cliente contém o código:
Cond = LerReg( pArqA , pBuffer ) ;
switch ( Cond )
{
case Leu_OK:
/* tratar o caso de leitura normal */
break ;
case Leu_Erro:
printf( "\nErro de leitura no arquivo: %s" , NomeArqA ) ;
printf( "\nPrograma sendo cancelado" ) ;
Finalizar( 4 ) ;
break ;
default:
printf( "\Erro de execução: LerReg condição desconhecida: %i" ,
Cond ) ;
printf( "\nPrograma sendo cancelado" ) ;
Finalizar( 4 ) ;
break ;
} /* fim switch */
© AvS
Estrutura de funções I - 17
Arrumação da casa (housekeeping)
Ao terminar a execução de um programa, componente ou função todos os
recursos alocados a este programa, componente ou função devem ser liberados
• arquivos abertos
• dispositivos bloqueados
• memória alocada
• recursos alocados
• semáforos, locks e outros elementos de sincronização
• estado do sistema para o que era antes de iniciar a execução
• perfil de execução
Assegurar a liberação de recursos alocados é particularmente complexo quando
o programa utiliza tratamento de exceções
• Pode-se utilizar um módulo de arrumação da casa para ajudar a resolver
• De qualquer maneira é necessária disciplina ao programar
© AvS
Download

Estruturas de funções I