Princípios de Modularidade I
Aula 04
Agenda
• O que são elementos de programas • Interfaces
• O que são
• A sua importância
• Composição via interfaces
Objetivo
Apresentar e ilustrar os conceitos de interfaces e do relacionamento entre elementos que se comunicam via interfaces.
Referência Capítulo 5
Elementos de programas
Interfaces e elementos
Interface é o mecanismo através do qual os elementos de programas realizam a troca de
• dados • comandos • eventos
Os elementos de programas podem ser • blocos de código
• fragmentos de texto de documentação • funções • figuras ou diagramas • seções de documentos • tipos de dados • classes • frameworks • arquivos de dados • módulos • componentes • programas • documentos completos Observação
• Nem todos os elementos são artefatos • Mas todos os artefatos são elementos
Exemplos de interfaces
Considere a declaração de função em C:
tpDadosAluno * pDadosAluno ObterAluno( unsigned idAluno )
• A interface esperada pela função – elemento servidor – ObterAluno é: • idAluno identificação de um aluno existente, do tipo unsigned; • Base de dados contendo registros de alunos, um valor global não
explicitado na lista de parâmetros
• Os dados do aluno idAluno extraídos da base de dados
• A interface esperada pelo ponto de chamada – elemento cliente ObterAluno é:
• ponteiro válido para uma estrutura do tipo tpDadosAluno contendo os dados do aluno idAluno.
• codificação de valor especial: o ponteiro será NULL, caso não exista registro com chave idAluno na base de dados utilizada
• A interface compartilhada pela função ObterAluno e pelos seus clientes:
• tipo tpDadosAluno descritor dos dados de um aluno. O tipo é tornado disponível através de algum mecanismo de declaração global
A interface com sistemas de suporte é realizada através de • identificadores
• chaves • handles
Interfaces entre elementos
Elementos de código interagem através de interfaces
Formas de interface
• argumentos passados para parâmetros de funções • valores retornados por funções
• tipos de dados declarados pelo usuário • variáveis membro de objetos
• variáveis globais
• dados contidos em arquivos • arquivos simples
• bases de dados • dados persistentes • interação com o usuário • interação com a plataforma • eventos
• sinais gerados externamente, ex. relógio
• sinais gerados internamente, ex. detecção de problemas, condição observada
• estados
• existência de dados
• dados satisfazendo determinada condição • quadro negro (“black board”)
Ocorrência de interfaces
Interfaces ocorrem em vários lugares e de várias formas, por exemplo • Entre blocos de uma função, considerando a seqüência de execução:
• cada bloco utiliza os dados resultantes da execução de blocos antecessores no tempo
• cada bloco produz resultados a serem utilizados pelos blocos sucessores no tempo bloco A while ( expressão B ) { bloco C } bloco D
leva a uma seqüência de execução:
bloco A expressão B bloco C expressão B bloco C … expressão B bloco D
• Entre funções de um mesmo programa • Entre classes de um programa
• Entre módulos de um programa • Entre diferentes programas • Entre programas e usuários
• Entre programas e sistemas operacionais
Relacionamento cliente – servidor
Cada instância de comunicação ocorre entre • um transmissor
• quem origina a comunicação • cliente
• solicita um serviço • um receptor.
• quem recebe e processa a comunicação • servidor
• presta um serviço
• um servidor pode dar respostas ao cliente
Exemplos
• O código da função A contém uma chamada para a função B • A é cliente do servidor B
• mais precisamente a chamada em A é cliente de B
• O módulo C depende de elementos da interface do módulo D • o módulo C é cliente do módulo servidor D
Caso especial
• para poder realizar o processamento
• o servidor pode solicitar ao elemento cliente mais dados ou até a realização de determinado processamento
Interfaces fornecidas por terceiros
As interfaces entre um determinado par < cliente , servidor > podem ser definidas por elementos diferentes deste par
Exemplos
• Os tipos dos parâmetros de uma função estabelecem uma interface
• parâmetros e correspondentes argumentos devem respeitar os tipos de dados declarados
• tipos coerentes • semântica coerente
• os tipos dos parâmetros podem estar definidos em algum outro lugar possivelmente em outro módulo
• Módulo A (declarador) => A_tpX struct { … }
• Módulo B (servidor) => int Func( A_tpX * pX ) { … } • Módulo C (cliente) => if ( Func( &UmX ) != 0 ) { … } • Bases de dados
• as funções que manipulam dados da base de dados podem depender de parâmetros cuja definição de tipo é estabelecida pela base de dados. • o seu esquema define uma interface
• meta-dados – “dados sobre os dados”
• para poder trocar dados via a base de dados, a interface precisa • ser conhecida
Interfaces em detalhe
Interfaces possuem:
Sintaxe: linguagem, regras e restrições aplicáveis aos itens intercambiados Exemplos:
• codificação da representação física: (computacional) dos valores
• exemplos: inteiro, flutuante, string terminado com o byte zero, struct • codificação de valores: determinam como devem ser redigidos valores de
determinado tipo
• exemplos: as regras para validar um CPF ou um número de matrícula • regras estruturais: estabelecendo interdependências de valores
• exemplo: em uma lista duplamente encadeada o antecessor do sucessor de um elemento é este mesmo elemento
Semântica: significado de cada item da interface Exemplos:
• O parâmetro float Veloc representa velocidade em m/s
• não basta saber que é float, é necessário saber que o parâmetro é velocidade e que esta é medida de uma certa forma
• O string passado por parâmetro é um nome de pessoa
• não basta saber que é string, é necessário também saber que denota o nome de uma pessoa e que satisfaz determinadas características, ex.: ressalta o nome ou apelido usual ao se comunicar com a pessoa
• O arquivo contém um cadastro de alunos com um formato bem definido • O nó é a raiz de uma estrutura de dados árvore n-ária
• Valores com significados específicos
Itens de interface
Interfaces são compostas por vários itens • especificações elementares • dados • tipos • funções • classes • tabelas • arquivos
As especificações determinam propriedades relevantes dos itens
• As especificações são necessárias para que o elemento correspondente à interface possa ser corretamente implementado e utilizado
• A especificação poderá ser redigida sob a forma de • comentários
• código em alguma linguagem de especificação, possivelmente misturado com o código fonte, por exemplo Z
• Uma parte da especificação estabelece propriedades das interfaces • semântica dos itens da interface
• valores permitidos
• valores que codificam condições especiais, ex. NULL, 0 , -1, NIL • relacionamentos entre itens da interface
• qualidade assegurada ou requerida • protocolos de uso.
• Protocolos de uso determinam como se deve utilizar (seqüências de ações) os itens da interface deste elemento para que o artefato possa operar
Princípio fundamental da composição via interface
Para assegurar que os elementos se integrem corretamente, os elementos cliente e os respectivos servidores devem utilizar exatamente as mesmas:
• especificações da interface
• estruturas de dados da interface, exemplos • base de dados
• tabela de símbolos • classes da interface
• tipos de dados da interface (struct) • declarações dos dados interfaceados • declarações das funções da interface
Para cada item da interface existente na interface entre um par de elementos: • é necessário que a sintaxe e a semântica transmitida pelo elemento
transmissor sejam coerentes com a sintaxe e a semântica esperada pelo elemento receptor
• dado • comando • evento • função
• usualmente é requerido que sintaxe e semântica sejam iguais
• é necessário que o estado do receptor seja consistente com os dados sendo transmitidos e com a intenção de uso do receptor tal como visto pelo
transmissor
• é necessário que a versão da interface seja a mesma tanto para o cliente como para o servidor
Validação de dados na interface
Caso não se possa garantir para todas as interações que o conjunto dos
possíveis valores de um dado transmitido seja um subconjunto dos valores que podem ser recebidos, é necessário que o receptor possua um validador para os dados recebidos.
Por exemplo
• rotina de raiz quadrada especifica que os dados devem ser maiores ou iguais a zero
• se em uma dada instância de ativação esta condição não se verificar, o erro terá sido cometido pelo transmissor
• quando nada é explicitamente especificado sobre os dados, é
necessário que a rotina intercepte todos os valores menores do que zero, emitindo algum retorno de erro
• o desenvolvedor não escapa de tratar o caso menor do que zero • ou especifica que não pode receber tal valor,
• neste caso o programador cliente arcará com as conseqüências da não observância
• ou especifica o que acontece se receber tal valor
• neste caso o programador cliente precisa saber tratar retornos de erro ou outras formas de interceptação de dados errados (exceções, cancelamento da execução)
Outro exemplo
• uma função que retorna um ponteiro.
• retorna o valor NULL caso tenha ocorrido alguma anomalia
• o receptor (cliente) deve verificar sempre se o valor retornado é NULL antes de tentar acessar a área apontada pelo ponteiro retornado.