Cs 2
-
Upload
fabio-nogueira-de-lucena -
Category
Technology
-
view
855 -
download
4
Transcript of Cs 2
![Page 1: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/1.jpg)
Projeto de Software:Durante a Construção de Software
![Page 2: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/2.jpg)
Em projetos pequenos, muitas atividades são consideradas parte da construção, inclusive o projeto.
![Page 3: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/3.jpg)
Em gera, o programador desenvolve parte do projeto.
![Page 4: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/4.jpg)
Como é o projeto?
Desenho de um diagrama na UML, contendo algumas classes e relacionamentos entre elas
Pseudocódigo de um método
Selecionar um padrão de projeto a ser empregado
![Page 5: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/5.jpg)
DesafiosProjeto de software é um problema “perverso”(é preciso resolver o problema para entendê-lo)
O projeto é obtido de um processo desordenado (faz uso de heurísticas)
Equilíbrio de prioridades(desempenho, produtividade, manutenção?)
Envolve restrições (tempo, custo, ...)
Não é determinístico (n pessoas, n projetos)
Evoluem (não nascem prontos)
![Page 6: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/6.jpg)
Principal objetivo técnico do software: controle da complexidade
![Page 7: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/7.jpg)
Como lidar com a complexidade?
Minimizar a quantidade de complexidade que o cérebro tem que lidar em dado momento
Evitar complexidade acidental desnecessária
![Page 8: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/8.jpg)
O que é desejável?
Complexidade mínima
Facilidade de manutenção
Baixo acoplamento
Extensibilidade
Reutilização
Alto fan-in, baixo fan-out, ...
![Page 9: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/9.jpg)
Níveis de projeto
Sistema (todo o software)
Divisão em subsistemas (vários pacotes)
Divisão em classes dentro de pacotes
Divisão em dados e rotinas (nas classes)
Projeto interno de rotina (método)
![Page 10: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/10.jpg)
Sistema
Todo o sistema
Em casos simples, nenhuma subidivisão é necessária antes da definição de classes
![Page 11: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/11.jpg)
SubsistemasROZANSKI, N. AND WOODS, E. SOFTWARE SYSTEMS ARCHITECTURE. READING, MASSACHUSETTS: ADDISON-WESLEY, 2005, P. 16.
![Page 12: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/12.jpg)
SubsistemasSTEVENS, R., BROOK, P., JACKSON, K., AND ARNOLD, S. SYSTEMS ENGINEERING. ENGLEWOOD CLIFFS, NEW JERSEY: PRENTICE HALL, 1998, P. 97.
![Page 13: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/13.jpg)
Subsistemas
GARLAND, J. LARGE-SCALE SOFTWARE ARCHITECTURE. INDIANAPOLIS, INDIANA: WILEY, 2003, P. 91.
![Page 14: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/14.jpg)
Muitos outros exemplos...
Handbook of Software Architecturehttp://handbookofsoftwarearchitecture.com
Apresenta + de 1000 padrões arquiteturais
![Page 15: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/15.jpg)
Subsistemas típicos
Regras de negócio (cômputos, regras como o aluno não poderá matricular se estiver em débito com a biblioteca, ...)
Interface com o usuário
Acesso a banco de dados
Dependências do sistema operacional, hardware específico, bibliotecas, ...
![Page 16: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/16.jpg)
Classes
![Page 17: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/17.jpg)
Projeto interno de rotinas
Projeto de métodos (algoritmos, pseudocódigo, ...)
Exemplo:Fazer uso de busca binária e, quando encontrado o elemento, verificar se se trata do elemento de menor índice (o que deve ser retornado).
![Page 18: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/18.jpg)
Ferramenta do projetista
HeurísticasNão existe caminho “bem definido” ou determinístico
![Page 19: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/19.jpg)
Da perspectiva OO
Encontre objetos do mundo real (modelagem de domínio)
Identifique objetos (software) e seus atributos
Determine o que pode ser feito com cada objeto
Determine o que cada objeto faz com os demais
Identifique partes visíveis de um objeto
Defina as interfaces de cada objeto
![Page 20: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/20.jpg)
Abstração
Capacidade de ignorar detalhes
Como construir uma casa sem ignorar detalhes?
Detalhes de software devem ser encapsulados!
![Page 21: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/21.jpg)
Ocultamento de informação
Decisões de projeto ou construção são ocultados de todas as outras classes!
Por exemplo, você sabe como está implementada a classe java.util.ArrayList?
![Page 22: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/22.jpg)
Como ocultar?
Usar constantes em vez de literais, ou seja, MAX_ALUNOS_POR_TURMA em vez de 30
Tipos de dados (por exemplo, ArrayList)
Rotinas (métodos)getNextID()
ClassesMegaSenaDownload
![Page 23: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/23.jpg)
Barreiras para o ocultamento
Distribuição excessiva
Dependências circulares
Dados de classes (dados globais)
Perda de desempenho (String.toString() e vetor.length)
![Page 24: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/24.jpg)
O que devo ocultar?
HABITUE-SE À PERGUNTA
![Page 25: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/25.jpg)
Áreas de provável alteraçãoRegras de negócio
Dependências de hardware
Entrada/Saída
Recursos não padronizados (linguagem de programação)
Áreas de projeto e construção difíceis
Variáveis de status
Restrições quanto ao tamanho dos dados
![Page 26: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/26.jpg)
Manter baixo acoplamento
PERSPECTIVAS
Tamanho (poucas conexões)
Visibilidade (pouca exposição)
Flexibilidade (facilidade de alterar conexões)
![Page 27: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/27.jpg)
Tipos. Acoplamento de:Parâmetro e dados simples (apenas tipos primitivos)
Objeto simples (cria instância de uma classe)
Parâmetro-objeto (+ elaborado do que parâmetro de tipos primitivos)
Acoplamento semântico (conhece o funcionamento de outro módulo)(imperceptível ao compilador ou IDE)
![Page 28: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/28.jpg)
Padrão de projeto
Soluções prontas para problemas comuns
Factory Method
Publish/Subscribe (ou Observer), ...
![Page 29: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/29.jpg)
Abstract Factory
![Page 30: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/30.jpg)
Práticas de Projeto
Iteração
Dividir e conquistar
Top-down/bottom-up
Prototipagem experimental
Projeto colaborativo
![Page 31: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/31.jpg)
Quanto de projeto é suficiente?Depende: (a) da experiência da equipe; (b) do conhecimento do domínio; (c) rotatividade da equipe; (d) quão crítica é a aplicação; (e) projeto é pequeno; (f) tempo de vida do software.
Steve McConnell diz:“Eu preferiria usar 80% do trabalho de projeto na criação e exploração de alternativas e 20% na criação de documentação menos aperfeiçoada.”
![Page 32: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/32.jpg)
Registro do projeto
No próprio código
Wiki
Resumos (enviar por email)
Use uma câmera digital
Diagramas UML
Documentos formais
![Page 33: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/33.jpg)
Padrões
IEEE Std 1016 Recommended Practice for Software Design Descriptions
IEEE Std 1471 Recommended Practice for Architectural Description of Software Intensive Systems
![Page 34: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/34.jpg)
Classes funcionais
![Page 35: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/35.jpg)
Evolução
• Inicialmente desenvolvia-se software pensando em instruções
• Depois em rotinas (anos 70 e 80)
• Hoje se pensa em classes!
![Page 36: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/36.jpg)
Tipo Abstrato de Dados
• Ou TAD
• Conjunto composto por dados e operações executadas sobre tais dados
![Page 37: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/37.jpg)
Exemplo
• Elevador: sobe um andar, desce um andar, move-se para andar específico, ...
• Menu: inicia novo menu, cria entrada no menu, ativa/desativa item de menu, ...
![Page 38: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/38.jpg)
Implementação de TAD
• Se a linguagem é orientada a objetos, então tem-se classes
• Caso contrário, você terá mais trabalho
![Page 39: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/39.jpg)
Classe
• Tipo Abstrado de Dados +
• Herança +
• Polimorfismo
![Page 40: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/40.jpg)
Passo + importante na criação de uma classe:Crie uma boa interface(oferece boa abstração)
![Page 41: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/41.jpg)
Dicas• A interface deve oferecer um nível de
abstração consistente
• Certifique-se de compreender qual abstração a classe está implementando
• Forneça serviços em pares (e opostos)(apaga/acende, define/obtém, ...)
• Mova informações não relacionadas para outra classe
![Page 42: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/42.jpg)
Mais dicas...
• Crie interfaces programáticas em vez de semânticas
• (semântica indica como a interface deve ser empregada)
• Considere a abstração e a coesão em conjunto
![Page 43: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/43.jpg)
Bom encapsulamento
• Abstração ajuda a controlar a complexidade (ignora detalhes)
• Encapsulamento (impede que detalhes sejam conhecidos)
![Page 44: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/44.jpg)
Dicas
• Minimize a acessibilidade de classes e membros
• Não exponha dados como públicos
• Elemento interno deve ser privado
• Não faça suposições sobre clientes
• Cuidado com violações semânticas de encapsulamento (não chamar db.connect() porque você sabe que db.busca(jogo) chama o método anterior se não existir conexão)
![Page 45: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/45.jpg)
Elementos internos da classe
• Relação tem-um (referência para objeto)
• Relação é-um (herança), por exemplo, Boi é um Animal.
![Page 46: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/46.jpg)
Dicas
• Pense em herança ou a proíba (final)
• Siga o PSL (Princípio de Substituição de Liskov)
• Evite árvores profundas de herança (7+-2)
![Page 47: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/47.jpg)
Mais dicas...
• Verifique se um switch pode ser substituído por uso de polimorfismo
switch (bicho.getTipo()) { case BOI: System.out.println(“boi”); break; case SAPO: System.out.println(“sapo”); break;}
![Page 48: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/48.jpg)
Funções
• Mantenha o menor número de métodos em uma classe
• Minimize o número de diferentes métodos chamados por uma classe
• Minimize as chamadas indiretas de métodos (Lei de Demétrio)
![Page 49: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/49.jpg)
TAREFA
• Crie código que ilustre uma substituição apropriada de switch pelo uso de polimorfismo
• Crie um diagrama de sequência (UML) que ilustre a Lei de Demétrio
• Crie uma classe com construtor privado e só permita a criação de uma única instância (Singleton)
![Page 50: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/50.jpg)
Métodos de Alta Qualidade
O que você deve saber!
![Page 51: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/51.jpg)
O que é rotina?
Rotina é um método, função ou procedimento que pode ser chamado para desempenhar um único propósito
![Page 52: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/52.jpg)
Razões para criar um método
Reduzir a complexidade
Introduzir uma abstração (aluno.isAprovado() em vez de aluno.naoDeveBilioteca && ...)
Evitar código duplicado
Melhorar a portabilidade, desempenho, ...
![Page 53: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/53.jpg)
Coesão
Quão intimamente estão relacionadas as operações em uma rotina?
Por exemplo, raizDoInverso(x) é menos coesa que raiz(x) e inverso(x).
![Page 54: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/54.jpg)
Tipos
Funcional (executa uma única operação)(MegaSena proposta não coesa)
Sequencial (não identifica função completa)
Comunicativa (usam os mesmos dados)
Temporal
Procedural (ordem de dados fornecidos pela UI)
Lógica (ocorre decisão por flag)
![Page 55: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/55.jpg)
Bons nomes de rotinas
Descreva tudo que a rotina faz
Evite imprecisão (fazCalculo()? geraImpressao()?
Não divida por número (r1(), r2(), r3(), ...)
Use nomes tão longos quanto necessário
Descreva o valor de retorno (raizQuadrada(x))
Use verbo + nome “fortes” (gerarExtrato(fulano)
![Page 56: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/56.jpg)
Bons nomes...
Use opostos corretamente
adicionar/remover em vez de adicionar/destruir
min/max em vez de min/maior
abrir/fechar em vez de abrir/encerrar
Convenções para operações comuns (get/set)
![Page 57: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/57.jpg)
Quão longa deve ser uma rotina?
• Tamanho de uma rotina é inversamente proporcional ao número de erros?!
• Não ultrapasse 200 linhas (não inclui linha em branco nem comentário)
![Page 58: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/58.jpg)
Como usar parâmetros?
• Siga a ordem entrada-uso-saída
• Considere convenções (in, out, ...)
• Se várias rotinas usam os mesmos parâmetros, use uma mesma ordem
• Use todos os parâmetros
• Não os use como variáveis locais
• Limite o número de parâmetros a 7
![Page 59: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/59.jpg)
TAREFA
• JavaBeans possui uma convenção para dar nomes a métodos que obtém e modificam valores de propriedades. Qual é esta convenção?
• java.lang.String possui os métodos regionMatches e copyValueOf, dentre outras. O uso de parâmetros é consistente?
![Page 60: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/60.jpg)
PROGRAMAÇÃO DEFENSIVA“Direção defensiva” em software
![Page 61: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/61.jpg)
Postura
Se alguém fizer algo perigoso, você não será prejudicado!
![Page 62: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/62.jpg)
Entradas inválidas
Verifique dados de todas as fontes externas
Verifique todos os parâmetros de entrada
Decida o que fazer com entradas incorretas
![Page 63: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/63.jpg)
Assertions
Código usado durante o desenvolvimento que permite a um programa fazer uma “auto-verificação” enquanto é executado
calculaMediaFinal(Aluno aluno) { .... mediaFinal = ... assert mediaFinal >= 0 && mediaFinal <= 10; return mediaFinal;}
![Page 64: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/64.jpg)
Dicas
Use um assert para algo que nunca pode ocorrer!
Use código de tratamento de exceção para o que pode ocorrer
Não use código executável em um assert
Use asserts para verificar pré-condições e pós-condições
![Page 65: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/65.jpg)
Tratando errosRetornar um valor “inofensivo” (String vazia, array sem elementos, ...)
Substituir pelos próximos dados válidos(browsers fazem isto com HTML)
Retornar a mesma resposta anterior
Valor válido mais próximo (-2 Kelvin para 0 Kelvin)
Registrar alerta em arquivo de log
![Page 66: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/66.jpg)
Tratando erros...
Retornar um código de erro
Chamar rotina de processamento de erro
Exibir mensagem quando erro for encontrado
Terminar a execução
![Page 67: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/67.jpg)
Tratamento de exceçõesUse para notificar ocorrências que não podem ser ignoradas
Use exceção apenas para situação excepcional
Não use exceção para “empurrar” para outro um problema seu
Evite gerar exceções em construtores, exceto se você as tratar
Exceção deve ser compatível com nível de abstração
![Page 68: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/68.jpg)
Tratando exceções...
Inclua mensagens (contexto) da exceção)
Evite blocos catch vazios
Não ignore exceções que código de biblioteca gera
Considere a criação de “relator” de exceção global
Padronize as exceções do seu projeto
![Page 69: Cs 2](https://reader037.fdocumentos.com/reader037/viewer/2022103018/558933c3d8b42ac1138b4715/html5/thumbnails/69.jpg)
TAREFA
• System.out.println(“x”) retorna void. Como é feito o tratamento em caso de erro?
• System.out.println(“x”) pode gerar uma exceção?
• O que é programar de forma ofensiva? (segundo Steve McConnell?)