Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Aula 14 Acoplamento e Coesão de Módulos Estrutura de Funções Francisco Dantas e Alessandro Garcia LES/DI/PUC-Rio Outubro 2012 Slides adaptados de: Staa, A.v. Notas de Aula em Programacao Modular; 2008. Ago 2009 2 /26Alessandro Garcia © LES - DI/PUC-Rio Especificação • Objetivos dessa aula – Estudar outros conceitos e princípios básicos de programação modular • Referência básica: – Capítulo 5 do livro texto • Seções 5.2.1 a 5.2.5 • Slides adaptados de: Staa, A.v. Notas de Aula em Programacao Modular; 2008. 2 Ago 2009 3 /26Alessandro Garcia © LES - DI/PUC-Rio Sumário • Acoplamento • Coesão – Tipos de coesão (Coincidental, Lógica, Funcional, etc.) Exemplos de Princípios de Modularidade... • ... Discutidos até aqui: – Cada módulo deveria implementar uma única abstração – Separação de interface e implementação – Definição explícita da sintaxe e semântica da interface – Encapsulamento – Módulos como tipos abstratos de dados – Garantir corretude sintática e semântica em conexões entre funções/módulos • nomes apropriados para funções e parâmetros • o código do módulo cliente e/ou servidor deve checar tal corretude (garantia de contrato) Ago 2009 4 /26Alessandro Garcia © LES - DI/PUC-Rio 3 5 /32Alessandro Garcia © LES/DI/PUC-Rio Outros Princípios de Modularidade • Atributo: Acoplamento – grau de interdependência entre módulos: • entre um módulo cliente e um módulo servidor • entre um módulo cliente e todos os outros módulos • entre todos os módulos de um sistema todo – princípio: minimizar acoplamento • Atributo: Coesão – grau de dependência entre elementos internos de um módulo: • entre duas funções de um módulo • entre dois blocos de código de uma função • entre itens de uma interface • etc.... – princípio: maximizar coesão Set 2009 6 /32Alessandro Garcia © LES/DI/PUC-Rio Acoplamento • Uma forma básica de medir acoplamento é contabilizando o número de conectores estabelecidos em uma interface – conectores • declarações (protótipos) de funções, declarações de estruturas na interface, variável global, etc... – uma medida indireta da dificuldade de assegurar a corretude • Por que esta estratégia não é uma análise tão precisa ou confiável do acoplamento real de um módulo? 4 Set 2009 7 /32Alessandro Garcia © LES/DI/PUC-Rio Acoplamento • Uma forma básica de medir acoplamento é contabilizando o número de conectores estabelecidos em uma interface – conectores • declarações (protótipos) de funções, declarações de estruturas na interface, variável global, etc... – uma medida indireta da dificuldade de assegurar a corretude • Também é possível contabilizar cada instância de relacionamento (conexão) – no caso de um módulo é um #include – no caso de funções é uma chamada – no caso de variáveis globais é um acesso a uma dessas variáveis 8 /32Alessandro Garcia © LES/DI/PUC-Rio Influência de acoplamento no... • O risco de erro e a dificuldade de assegurar corretude está relacionada com o esforço humano para assegurar a corretude – será menos difícil quanto mais puder ser verificado pelo compilador ou por alguma ferramenta de verificação – será mais difícil quanto mais depender da ação humana – Exemplo, na função double * OpMatriz( int dimLinhas, int dimColunas, int tamLinhas, int tamColunas, double * pMatriz ) • em uma chamada qualquer permutação dos quatro primeiros argumentos é válida do ponto de vista do compilador • Qual a influência de acoplamento em manutenibilidade? 5 9 /32Alessandro Garcia © LES/DI/PUC-Rio Influência de acoplamento no... • O risco de erro e a dificuldade de assegurar corretude está relacionada com o esforço humano para assegurar a corretude – será menos difícil quanto mais puder ser verificado pelo compilador ou por alguma ferramenta de verificação – será mais difícil quanto mais depender da ação humana – Exemplo, na função double * OpMatriz( int dimLinhas, int dimColunas, int tamLinhas, int tamColunas, double * pMatriz ) • em uma chamada qualquer permutação dos quatro primeiros argumentos é válida do ponto de vista do compilador • A manutenibilidade: qualquer mudança na implementação do servidor, afeta os módulos clientes 10 /32Alessandro Garcia © LES/DI/PUC-Rio Outros Princípios de Modularidade • Atributo: Acoplamento – grau de interdependência entre módulos: • entre um módulo cliente e um módulo servidor • entre um módulo cliente e todos os outros módulos • entre todos os módulos de um sistema todo – princípio: minimizar acoplamento • Atributo: Coesão – grau de dependência entre elementos internos de um módulo: • entre todas funções de um módulo • entre duas funções de um módulo – princípio: maximizar coesão 6 11 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão • ... relacionamento entre funções via chamadas entre elas ou acesso compartilhado a variáveis comuns do módulo Módulo A Módulo B Função Chamada Módulo C Módulo D Coesão baixa Coesão alta 12 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão • A coesão avalia o inter-relacionamento entre os elementos que constituem um módulo – quanto mais forte for o inter-relacionamento, melhor será a coesão – (co)incidental os elementos estão juntos somente por conveniência ou falta de cuidado do programador – lógica os elementos possuem funcionalidades correlatas mas tais funcionalidades não operam sobre o mesmo conjunto de dados – funcional os elementos definem uma única função ou módulo que implementa exatamente um conceito (relação semântica) • abstração de dados os elementos definem uma único TAD 7 13 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão • A coesão avalia o inter-relacionamento entre os elementos que constituem um módulo – quanto mais forte for o inter-relacionamento, melhor será a coesão – (co)incidental os elementos estão juntos somente por conveniência ou falta de cuidado do programador – lógica os elementos possuem funcionalidades correlatas mas tais funcionalidades não operam sobre o mesmo conjunto de dados – funcional os elementos definem uma única função ou módulo que implementa exatamente um conceito (relação semântica) • abstração de dados os elementos definem uma único TAD 14 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão Coincidental • Um módulo coincidentemente coeso é aquele cujos elementos contribuem para atividades sem qualquer relação significativa entre si • Este tipo de coesão ocorre quando os procedimentos internos dos módulos estão dispostos de tal forma que não existe nenhuma ligação lógica entre eles • Exemplo: Módulo X incorpora as seguintes funções... – arrumar carro – cozinhar bolo – levar cachorro para passear – preencher ficha de inscrição para o curso – tomar uma cerveja – levantar da cama – reunir todo mundo – ir ao cinema 8 Coesão Coincidental Ago 2009 15 /26Alessandro Garcia © LES - DI/PUC-Rio Modulo XPTO { int AcharPadrao (char * texto, char * padrão) { // ... } int ComputarMedia (int i1, int i2) { // ... } void IniciarSistema (char * nome) { // ... } void AbreArquivos (char * nome) { // ... } } 16 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão Lógica • Um módulo logicamente coeso é aquele cujos elementos contribuem para atividades da mesma categoria geral – atividade ou as atividades a serem executadas são selecionadas fora do módulo – Ou: a atividade escolhida será feita através de um parâmetro ao chamar o módulo • Isto ocorre, por exemplo, quando cada atividade é implementada como parte de um bloco switch ou de if’s • Um módulo com coesão lógica executa uma função de uma dada classede funções • Imagine se você estiver planejando uma viagem, poderia pensar nos seguintes itens – Ir de carro – Ir de trem – Ir de navio – Ir de avião O que relaciona estas atividades? 9 Coesão Lógica Ago 2009 17 /26Alessandro Garcia © LES - DI/PUC-Rio Modulo TratamentoErros { int EmitirMensagemErro (int codigo_erro) { // ... } int RecuperacaoEspecificaOrdenacao (int codigo_erro, int a []) { // ... } int RecuperacaoEspecificaString (int codigo_erro, char * str) { // ... } int RecuperacaoEspecificaArmazenamento (int codigo_erro, , char * str) { // ... } void FinalizacaoErroFatal (int codigo_erro) { // ... } } 18 /32Alessandro Garcia © LES/DI/PUC-Rio Coesão Funcional • Um módulo com coesão funcional contém elementos que contribuem para execução de uma e apenas uma tarefa relacionada ao problema • Um módulo funcionalmente coeso possui mais de um elemento (p.e. várias funções) – porém todos eles necessários e suficientes para implementar um único conceito • Pessoa, Professor, Aluno, Curso, etc... • TADs: listas, árvores, etc... • Cada módulo tem um propósito forte, único e funções operam sobre o mesmo conceito
Compartilhar