Fundamentos de Projeto
2
Objetivos
• Princípios de Projeto:
– abstração;
– refinamento;
– ocultamento da informação;
– independência funcional;
– modularidade;
– coesão e – acoplamento.
• Projeto Detalhado.
• Critérios.
• Implementação.
Princípios de Projeto de SW
• Projeto: processo em que se aplicam várias técnicas e princípios a fim de definir um dispositivo, um processo ou um sistema com detalhes suficientes para permitir sua implementação.
• Core do processo de desenvolvimento de software.
4
Princípios de Projeto de SW
(cont.)• Processo Iterativo: Inicialmente representado em nível alto de abstração, levado a maior detalhe com iterações e refinamentos.
• Segmentado:
– vários (sub-)projetos dentro de um único;
– várias especialidades;
– diversidade de conhecimento.
5
Princípios de Projeto de SW
(cont.)• Projeto de Arquitetura: definição de grandes componentes estruturais e relacionamentos;
• Projeto de Dados: estruturação dos dados necessária à implementação;
• Projeto de Interfaces:
– internas - comunicação interna;
– externas - entre sistemas;
– usuário - com pessoas.
• Projeto Procedimental: refinar e detalhar os procedimentos de relacionamento estrutural.
6
Fluxo da Informação
7
Conceitos
• Abstração: início em nível próximo a análise, sendo reduzido a medida que se avança;
• processo pelo qual identificamos os aspectos importantes de um fenômeno ignorando seus detalhes.
• Refinamento: processo de elaboração, o projeto vai de níveis de abstração mais altos para menores;
8
Conceitos
(cont.)• Ocultação de Informação: dados e procedimentos de um módulo / componente inacessível a outro;
• Modularidade: deve estruturar o sistema como módulos/componentes coesos e fracamente acoplados;
Conceitos
(cont.)• Independência Funcional: interações entre módulos minimizada;
• o quanto o sistema é independente de particularidades de linguagens, das características do S.O. e domínio.
• Critérios de qualidade:
– coesão e – acoplamento.
10
Fundamentos
• Abstração
– apresentação em diferentes níveis de detalhes:
• procedimental.
• dados.
• Refinamento
– processo de elaboração:
• projeto top-down (passo a passo).
11
Fundamentos
(cont.)• Modularidade
– divisão em componentes nomeáveis e endereçáveis:
• viabiliza administração;
• conceitua tipos abstratos de dados.
• Arquitetura – Referência a:
• estrutura hierárquica de componentes (módulos);
• estrutura de dados.
12
Fundamentos
(cont.)• Arquitetura (cont.)
13
Fundamentos
(cont.)• Arquitetura: diferentes estruturações
14
Fundamentos
(cont.)• Hierarquia
Fundamentos
(cont.)• Estrutura de Dados
– representação do relacionamento lógico entre elementos de dados individuais.
– tão importante quanto a arquitetura pois afeta o projeto procedimental final.
16
Fundamentos
(cont.)• Procedimento de Software
– detalhes de processamento de cada módulo;
– especifica:
• processamento.
• seqüência de eventos.
• pontos de decisão exatos.
• operações representativas.
• estrutura e / ou organização de dados.
17
Fundamentos
(cont.)• Ocultamento de Informação – aspecto fundamental da modularidade;
– critério que melhora a fase de teste;
– facilita a manutenção do software;
– módulos devem ter responsabilidades bem definidas e ser soberanos sobre as decisões de projeto que ensejam.
18
Acoplamento
• o quão "amarrado" uma parte do sistema é às outras partes.
• o quão dependente uma parte do sistema é das estruturas internas das outras partes do sistema.
• uma medida do quanto uma classe conhece do mundo à sua volta (O.O.).
19
Acoplamento
(cont.)• Baixo acoplamento:
– facilita o entendimento do código;
– facilita a manutenção do código;
– minimiza efeitos colaterais, que um dano em um dado / módulo se propague;
– facilita o teste / debug isolado.
20
Coesão
• é uma medida da diversidade dos "tópicos"
abordados por um módulo.
• quanto menor, maior a sua coesão.
• um módulo focado em um aspecto do sistema, é coeso.
• sistemas onde os aspectos são difusos, são pouco flexíveis e dificultam extensões, modificações e reutilizações.
• exemplos: classes, métodos, funções, etc.
Coesão
(cont.)• Facilita o reuso:
– simples utilização se necessário;
– sem “extras” associados;
• Facilita a manutenção:
– sem duplicação de código;
• Facilita o entendimento do código:
– responsabilidades bem definidas;
22
Encapsulamento
• reforça a alta coesão e baixo acoplamento;
• consiste em ocultar detalhes de implementação;
• Interação por interfaces;
• evitar o acesso público a atributos, baixando o acoplamento;
• na prática, garante-se encapsulamento por:
– atributos privados (private);
– interface de métodos não-privado.
23
Modularidade
• módulo: componente de sistema que fornece um ou mais serviços para outros módulos.
• normalmente utiliza os serviços de outros módulos, não sendo portanto considerado um sistema independente.
24
Modularidade
(cont.)• conceito fundamental para o projeto de sistemas complexos
• em um desenvolvido de forma monolítica, o número de caminhos de controle, variáveis e a complexidade global tornariam sua compreensão praticamente impossível.
25
Modularidade
(cont.)• tomemos as funções C(x), complexidade de um problema, e E(x), esforço associado para resolver o problema.
• dado dois problemas P1 e P2, observa-se:
• se C(P1)> C(P2)então E(P1)> E(P2)
26
Modularidade
(cont.)• simplificando: demora mais para se resolver um problema mais difícil.
• Também temos que:
• C(P1 + P2)> C(P1)+ C(P2)
– a complexidade de um problema que combine P1 e P2 é maior do que a complexidade percebida quando cada problema é considerado separadamente.
• E(P1 + P2)> E(P1)+ E(P2)
– é mais fácil resolver um problema complexo quando ele é dividido em partes
Modularidade
(cont.)28
Projeto Detalhado
• Etapas:
– checar pré-requisitos e pós-requisitos;
– definir informação a ser ocultada, entradas, saídas e tratamento de erros;
– projetar testes para os módulos;
– analisar aspectos de eficiência;
– pesquisar algoritmos e estruturas de dados;
– escrever script em pseudolinguagem, através de refinamentos sucessivos;
– analisar e projetar estruturas de dados;
– fazer inspeção final.
29
Projeto Detalhado
(cont.)• Revisão:
– correção da tradução do projeto para a linguagem de programação;
• por exemplo, relacionamentos, heranças e interfaces (UML) implementados da maneira correta.
– correção das interfaces dos módulos projetados;
• as operações estão corretas e documentadas corretamente.
30
Projeto Detalhado
(cont.)• Revisão (cont.):
– correção das máquinas de estado;
• não possuem estados inatingíveis nem deadlocks (ciclos de estados sem saída).
• estados e transições são completos e ortogonais (contemplam todas as situações possíveis sem intersecção).
– correção da lógica do pseudocódigo;
• condições são logicamente corretas e otimizadas
31
Critérios de Projeto
• exibir organização hierárquica que faça uso inteligente do controle entre os
componentes de software.
• modularidade, deve ser logicamente dividido em componentes que executem funções e subfunções específicas.
• conter uma representação distinta e separável de dados e procedimentos.
• módulos que apresentem características funcionais independentes
32
Critérios de Projeto
(cont.)• interfaces que reduzam a complexidade de conexões entre os módulos e com o ambiente externo.
• deve ser derivado usando-se um método capaz de permitir repetições e que seja orientado pelas informações obtidas durante a análise de requisitos de software.
Implementação
• Codificação
– transformar script em comentários de alto nível;
– preencher código abaixo de cada comentário derivado do pseudocódigo;
– checar código quanto à correção lógica;
– checar código quanto às regras de codificação;
– fazer inspeção final.
34
Implementação
(cont.)• Revisão
– correção da digitação;
– correção sintática;
– correção lógica;
– inclui consistência com desenho detalhado;
– obediência ao padrão de codificação;
– qualidade e consistência dos comentários.
35
Implementação
(cont.)• Finalização
– checagem formal do desenho detalhado e código do módulo;
– compilação dos componentes do módulo;
– testes de unidade necessários.
36
Pontos Chave
• abstração: ignore detalhes, foco no core.
• refinamento: detalhamento.
• ocultamento: módulos soberanos.
• independência: não dependente de particularidades.
• coesão: foco dos módulos.
• acoplamento: dependência.
37
Pontos Chave
(cont.)• modularidade: divisão em componentes.
Otimização de custos.
• Projeto Detalhado:
– verificação de requisitos;
– projetar testes;
– analisar eficiência;
– estrutura de dados.
38
Pontos Chave
(cont.)• Critérios:
– modularidade;
– independência de dados;
– independência de funcionalidades;
– simplicidade;
– cumprir com requisitos.
• Implementação:
– regras de codificação;
– comentários;
– consistência, correção e qualidade.