Engenharia de Software Graduação em Engenharia de Sistemas e Computação Faculdade de Engenharia Universidade do Estado do Rio de Janeiro UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 1 Engenharia de Software [1] • Def1.: é a parte da Ciência da Computação que lida com a construção de Sistemas de Software que são grandes e complexos, de modo que são desenvolvidos por equipes de engenheiros (analistas e programadores). Estes Sistemas de Software existem em múltiplas versões e são usados por vários anos. • Def2. [Parnas – 1987]: compreende a construção de software com múltiplas versões, envolvendo vários indivíduos. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 2 Engenharia de Software [2] • A atividade de programação é individual, enquanto a Engenharia de Software é uma atividade de equipe. • Mesmo para especificar o que um sistema de software deve fazer, não existem métodos de aceitação generalizada. • Abordagem: apresentar alguns princípios gerais que são essenciais para o desenvolvimento de software. • Princípios são mais importantes que metodologias ou notações particulares usadas para o desenvolvimento de software. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 3 Engenharia de Software [3] Siste ma Sistema de software UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 4 Engenharia de Software [4] • A Engenharia de Software requer uma visão geral da área de Engenharia de Sistemas; • É preciso que o engenheiro de software tenha envolvimento com os requisitos inicialmente formulados para o sistema (do qual o software é parte) como um todo; • Requer um conhecimento da área de aplicação; • Lembrar que em qualquer área da engenharia deve-se observar compromissos. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 5 Visão histórica da ES [1] • Inicialmente implementação de alguns algoritmos (via seqüência de instruções) bem definidos (ainda que eventualmente complexos). • Gradativamente foram surgindo projetos de software de grandes dimensões (Ex. Sistema SABRE na década de 60, IBM OS 360, etc.) • Constatou-se dificuldades na aplicação das técnicas utilizadas no desenvolvimento de projetos de pequeno porte em projetos de grande porte (scalability). • De uma forma geral, os projetos de grande porte ultrapassavam os custos e o tempo inicialmente previstos para a sua conclusão. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 6 Visão histórica da ES [2] • Profundas alterações no custo de hardware X custo de software Custo Total do Sistema (US$) HW (US$) SW (US$) t UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 7 Visão histórica da ES [3] • Mudanças nos requisitos iniciais do sistema pareciam afetar diversas partes do projeto (efeito cascata). Diversas soluções foram aventadas: • – – – – • Aprimorar as técnicas gerenciais; Novas formas de se organizar equipes; Melhores linguagens e ferramentas; Adoção de padrões (ex.: convenções para codificação dos programas, documentação, etc.); Consenso final: A construção de software deveria ser abordada de forma similar à de outros sistemas complexos de grande porte, tais como: pontes, refinarias, fábricas, navios e aviões. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 8 Visão histórica da ES [3] • A abordagem de engenharia no desenvolvimento de software requer: – – – – – – UERJ Setembro 2001 Gerência Organização Ferramentas Teorias Metodologias Técnicas © Oscar Luiz Monteiro de Farias 9 O Engenheiro de Software • Precisa dominar: Programming in the small Programming in the large UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 10 Conhecimentos do ES [1] Programming in the small • Conhecimento de LPs • Estrutura de Informação • Algoritmos • Inteligência UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 11 Conhecimentos do ES [2] Programming in the large • Familiar com diversas abordagens de projetos • Traduzir requisitos vagos em especificações precisas • Ter conhecimento (ou capacidade de rapidamente adquirir conhecimento) do domínio de aplicação • Capacidade de transitar entre os diferentes níveis de abstração exigido nas várias fases do projeto • Técnicas de Modelagem • Facilidade de Comunicação e de lidar com pessoas • Capacidade de planejar o trabalho (scheduling) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 12 Ciclo de Vida do SW • Def.: Conjunto de fases associadas ao desenvolvimento e manutenção do software. • Em cada fase desenvolve-se alguma parte do sistema ou algo associado ao sistema (ex.: plano de teste, manual do usuário, etc.) • No modelo waterfall cada fase possui pontos de início e fim e outputs bem definidos. • Existem outros modelos de ciclo de vida UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 13 Ciclo de Vida do SW Modelo Waterfall Análise de Requisitos e Especificação Projeto (arquitetura e detalhado) Codificação e Teste de Módulos Integração e Teste do Sistema Entrega do SW e Manutenção UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 14 ES x Ciência da Computação • • • • • Linguagens de Programação Sistemas Operacionais Banco de Dados Inteligência Artificial Modelos Teóricos ES x Outras Disciplinas: • Gerenciamento • Engenharia de Sistemas UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 15 Engenharia de Software Princípios de Engenharia Aplicados a Diferentes produtos de software 10 passo: Discernir um conjunto de qualidades que caracteriza 20 passo: Descobrir que princípios devem ser aplicados para s sw com as qualidades desejadas. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 16 Natureza e Qualidades do SW • Maleabilidade (Contudo uma alteração no software deve ser encarada como uma mudança que afeta desde o projeto até o código gerado) • Atividade mão-de-obra intensiva (todavia requer mais “engenheiros” do que pessoal tradicionalmente dedicado à manufatura) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 17 Qualidades do SW Perspectivas Gerente do Projeto (produtividade e facilidade de controle) Software Usuário (confiabilidade, facilidade de uso eficiência) Desenvolvedor (verificabilidade, manutenabilidade, portabilidad UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 18 Qualidades Externas x Internas • Qualidades externas: são aquelas visíveis aos usuários. • Qualidades internas: são as que dizem respeito aos desenvolvedores do sistema. • As qualidades internas lidam, em grande parte, com a estrutura do software e ajudam os desenvolvedores a atingir as qualidades externas. • As qualidades internas são necessarias para se atingir a confiabilidade (reliability) do sw. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 19 Processo x Produto de Software • Processo de Software: o conjunto de atividades desenvolvidas durante a produção de sw. • Gerenciamento de Configuração: é a parte do processo de produção de sw que é voltado para a manutenção e controle das relações entre as várias versões de um produto de sw aí incluídos os seus diversos módulos. • Ferramentas de gerenciamento de configuração possibilitam a manutenção de famílias de produtos e seus respectivos componentes. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 20 Qualidades Principais: • [1] Def.: Correctness: Um programa é dito funcionalmente correto se ele se comporta de acordo com as especificações das funções que ele deve prover (functional requirements specifications). • Conseqüências da definição de correctness: Assume que a especificação do sistema está disponível. Que é possível determinar de forma não ambígua se um programa está conforme ou não às especificações. • Correctness é uma propriedade matemática que estabelece uma equivalência entre o sw e a sua especificação. • Correctness especificação formal e testes. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 21 Qualidades do Software [2] • [2] Def.: Reliability (Confiabilidade): Informalmente, um sw é reliable se o usuário pode depender dele. • Def.: Reliability: a probabilidade de que o sw irá operar de acordo com o esperado dentro de um intervalo de tempo especificado. • Espera-se que os produtos de engenharia sejam confiáveis (sw ainda não atingiu este estágio – ex.: Produtos são liberados para o mercado com lista de bugs). UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 22 Qualidades do Software [2]... Reliability Correctness UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 23 Qualidades do Software [3] • [3] Def.: Robustness (Robustez): Um sistema é dito robusto se ele comporta-se “razoavelmente”, ainda que em circunstâncias que não foram antecipadas na especificação dos requisitos do sistema. • Atenção! Se pudéssemos estabelecer precisamente o que deveríamos fazer para tornar uma aplicação robusta, seríamos capazes de especificar o seu comportamento “razoável” completamente. Neste caso robustness seria equivalente a correctness ou ainda a reliability (no sentido do slide anterior). UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 24 Qualidades do Software [4] • [4] Def.: Performance: qualidade intimamente associada com eficiência. Um sistema de software é eficiente se ele usa os recursos computacionais economicamente. • Performance afeta: – a utilização do software – a escalabilidade do software • Abordagens para se avaliar a performance de um sistema: 1) análise da complexidade dos algoritmos; 2) medidas (via monitores); 3) simulação. • Aplicada a processo, performance = produtividade UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 25 Qualidades do Software [5] • [5] Def.: User Friendliness: um sistema de software é dito “user friendly” (amigável ao usuário), quando os seus usuários humanos acham-no de fácil utilização. • A interface com o usuário é um dos importantes componentes da user friendliness. • Importância do desenho industrial e psicologia. • Em diversas áreas da engenharia alcançase a facilidade de uso através da padronização da interface humana. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 26 Qualidades do Software [6] • [6] Def.: Verificabilidade: qualidade de um sistema de software em que as suas propriedades são facilmente verificáveis. • Pode-se verificar as propriedades de um sistema através de: – métodos de análise formais – testes (uso de monitores de software) • Projeto modular, disciplina na codificação e uso de LP´s apropriadas contribuem para a verificabilidade. • É uma qualidade interna. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 27 Qualidades do Software [7] • [7] Def.: Maintainability (mantenubilidade): O termo manutenção de software é normalmente utilizado para se referir a modificações que são feitas a um sistema de software após o seu release inicial (i.e., após ter sido disponibilizado para o seu público alvo). • A manutenção pode ser: corretiva, adaptativa e perfectiva. • Manutenção corretiva: trata da remoção dos erros residuais presentes no software após a sua entrega, ou dos erros introduzidos durante a própria manutenção. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 28 Qualidades do Software [7]... • Manutenção adaptativa:compreende o ajuste da aplicação a alterações no seu ambiente (ex. adaptaçõ a um novo sistema operacional, a novos dispositivos legais, etc.) • Manutenção perfectiva:compreende a alteração do software, de modo a melhorar a sua qualidade (ex.: acrescentar novas funções ao software de modo a facilitar o seu uso). • Existem evidências de que os custos de manutenção excedem a 60% do custo total do software. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 29 Qualidades do Software [8] • [8] Def.: Repairability: um sistema de software é dito reparável quando ele permite a correção de seus defeitos com uma quantidade limitada de trabalho. • Na engenharia tradicional uma técnica para se tornar os produtos reparáveis é o uso de partes e peças padrão que possam ser facilmente substituíveis. • Repairability é afetada pelo número de componentes do produto. • Em software aumenta-se a reparabilidade através de técnicas adequadas de modularização e do uso de ferramentas adequadas (ex.: LPs de alto nível) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 30 Qualidades do Software [9] • [9] Def.: Evolvability: trata-se da capacidade de um sistema de software de incorporar alterações ao seu projeto original, de modo a incorporar novas funções ou alterar funções já existentes. • Estudos demonstram que a evolvability decresce a cada novo release de um produto de software. • Desde a concepção inicial do produto deve-se levar em consideração a capacidade de evolução do produto. • É uma das mais impportantes qualidades do sw. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 31 Qualidades do Software [10] • [10] Def.: Reusability: trata-se de uma qualidade mais aplicável aos componentes de um sistema de software que ao sistema como um todo. É a capacidade de se usar módulos/componentes de software já existentes, a fim de se construir novos produtos. • Exs.: bibliotecas científicas, classes do JDK, etc. • É uma qualidade difícil de se conseguir a posteriori. Deve-se procurar alcançá-la à medida que os próprios componentes vão sendo construídos. • A reusabilidade pode se dar em vários níveis: i) pessoas – conhecimento do domínio da aplicação; ii) requisitos do sistema; iii) módulos; iv) código. • Aplica-se ao produto (sw) e ao processo (metodologias de software, ciclo de vida). UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 32 Qualidades do Software [11] • [11] Def.: Portability: é a capacidade de um sistema de software ser executado em diferentes ambientes. • Mesmo que restrita a uma mesma família de processadores, a portabilidade é importante, em virtude de variações no conjunto de instruções e na capacidade de memória. • Há necessidade de técnicas que permitam ao sw determinar as capacidades do hw e se adaptar às mesmas. • Ex. Java, padrões do tipo SQL. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 33 Qualidades do Software [12] • [12] Def.: Understandability: é a facilidade com que um sistema de software é compreendido, levando-se em conta, naturalmente, que alguns tipos de sistemas são mais complexos que outros. • Understandability é uma qualidade com aspectos internos e externos. Do ponto de vista interno ajuda a alcançar outras qualidades, tais como evolvability e verifiability. Do ponto de vista externo, o usuário considerará um sistema compreensível se ele possuir um comportamento previsível e for user friendly. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 34 Qualidades do Software [13] • [13] Def.: Interoperability: diz respeito à habilidade de um sistema coexistir e cooperar com outros sistemas. • O ambiente UNIX, encoraja as aplicações a possuir uma interface simples e padrão, o que permite que a saída de uma aplicação seja usada como entrada para outra aplicação. • Interoperability pode ser atingida através da padronização de interfaces. • Open System: é uma coleção extensível de aplicações independentes que cooperam entre si para formar um sistema integrado. Permite que organizações independentes adicionem novas funcionalidades após a entrega do sistema ao mercado. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 35 Qualidades do Software [14] • [14] Def.: Produtividade: é uma qualidade do processo de produção de software. É a qualidade de performance aplicada ao processo de software. • Trade-offs – Ex.: a programação de módulos reusáveis é mais difícil e implica em menor produtividade no desenvolvimento de software. • Necessidade de métricas para se medir a produtividade do software ou qualquer outra qualidade. • Ferramentas especiais têm um impacto positivo sobre a produtividade (ex,: ferramentas CASE, LPs de alto nível, emprego de determinadas metodologias, etc.) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 36 Qualidades do Software [15] • [15] Def.: Timeliness: trata-se da habilidade de se entregar um produto no tempo aprazado para tal. • Timeliness requer um planejamento cuidadoso, uma estimativa apropriada do trabalho a ser realizado e marcos (milestones) especificados e verificáveis (do trabalho já desenvolvido). • Problemas: dificuldade de se mensurar a produtividade dos desenvolvedores de sw; falta de métricas adequadas; uso de marcos imprecisos e não verificáveis; alteração contínua dos requisitos do sistema. • Incremental delivery UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 37 Qualidades do Software [15]... função Requisitos do usuário Sistema real tempo t0 t1 t4 UERJ Setembro 2001 t2 t3 © Oscar Luiz Monteiro de Farias 38 Qualidades do Software [16] • [16] Def.: Visibilidade: Um processo de desenvolvimento de sw é visível se todas as suas etapas e o seu estado corrente estão claramente documentados, i. e., estão facilmente disponíveis para um exame (análise) externo. • a especificação dos requisitos do sistema e dos requisitos do projeto também devem estar bem documentados. • Tensão entre membros da equipe de desenvolvimento: estabilização x desestabilização do estabilização x desestabilização do software UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 39 Qualidades do Software [16]... • Um produto é visível se ele é estruturado como uma coleção de módulos, com funções claramente compreensíveis e se há fácil acesso à sua documentação. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 40 Princípios da Engenharia de Software... • Serão abordados princípios gerais que são centrais para um desenvolvimento de software bem sucedido. • Estes princípios dizem respeito ao processo de software e ao produto final. • Os princípios são colocações gerais e abstratas que descrevem propriedades desejáveis do processo de software e do produto final. • Para aplicar os princípios precisamos de técnicas e metódos. • Os métodos e técnicas ajudam a incorporar aos processos e aos produtos as propriedades (qualidades) desejadas. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 41 Princípios da Engenharia de Software... • Métodos são orientações gerais que governam a execução de alguma atividade. São abordagens rigorosas, sistemáticas e disciplinadas • Técnicas, em geral, possuem uma aplicabilidade mais restrita. • Metodologia = métodos + técnicas • O objetivo da metodologia é promover uma certa abordagem para resolver um problema, através de uma escolha prévia dos métodos e técnicas a serem usados. • Ferramentas suportam a aplicação de metodologias, métodos e técnicas. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 42 Princípios da Engenharia de Software... Ferramentas Métododologias Métodos e técnicas Princípios UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 43 Princípios da Engenharia de Software... • [1] Rigor e Formalismo Existem vários níveis de rigor. O maior deles seria o formalismo. Ex.: A descrição de um programa pode ser feita através de uma linguagem natural ou por meio de uma descrição formal em uma linguagem com comandos lógicos. • A vantagem do formalismo é que é a base do processo de automação. • Tradicionalmente, a única fase do processo de desenvolvimento de software que possui uma abordagem formal é a de programação. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 44 Princípios da Engenharia de Software... • Deve-se aplicar rigor e formalismo em todas as fases do processo de desenvolvimento de software. • Uma documentação rigorosa do processo de software ajuda no reuso do processo em outros projetos similares e também na manutenção do sistema. • Além disso facilita a monitoração do processo (timeliness e produtividade) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 45 Princípios da Engenharia de Software... • [2] Separation of Concerns (separação das preocupações): permite que se lide com os diferentes aspectos individuais de um problema. • Várias decisões devem ser tomadas no desenvolvimento de um produto de software relativas: – i) às características desejáveis do produto, tais como: funções ofertadas, plataformas em que será executado o sw, eficiência em termos de tempo e espaço, tipos de interfaces com o usuário, etc. – ii) ao processo de desenvolvimento: ambiente de desenvolvimemto, organização e estrutura das equipes, planejamento, procedimentos de controle, estratégias de projeto; – iii) a aspectos econômicos e financeiros. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 46 Princípios da Engenharia de Software... • A Separation of Concerns pode se dar de várias formas: i) no tempo – é a motivação subjacente ao ciclo de vida do software; ii) em termos das qualidades desejadas para o sw (ex.: primeiro assegura a correctness e então reestrutura o programa para garantir a eficiência); iii) diferentes visões do sistema (fluxo de dados entre as diferentes atividades X fluxo de controle que governa a sincronização das atividades); iv) diferentes partes do sistema Modularidade; v) divisão de responsabilidades e tarefas; UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 47 Princípios da Engenharia de Software... • • [3] Modularidade: este princípio procura subdividir um sistema em vários módulos. Benefícios da modularidade: permite que a separation of concerns seja aplicada em duas fases: 1. Ao se lidar com cada módulo isoladamente (ignorando os detalhes dos outros módulos); 2. Ao se lidar com as características gerais de cada módulo e suas relações com os outros módulos, de forma a integrá-los e a construir um sistema coerente. • Bottom up x Top down design UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 48 Princípios da Engenharia de Software... • Modularidade é um princípio importante na engenharia, estando presente na maioria dos processos e produtos. • O princípio da modularidade não apenas é um princípio desejável na fase de projeto; ele permeia toda a atividade de produção de software. • As três metas da modularidade: – A decomposição de sistemas complexos – A composição de sistemas a partir de módulos – A compreensão do sistema em partes (módulos) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 49 Princípios da Engenharia de Software... • Idealmente na produção de software seria desejável a montagem de novas aplicações a partir de módulos já disponíveis em bibliotecas. • Para se alcançar as três metas da modularidade os módulos devem ter alta coesão e um baixo acoplamento. • Um módulo possui alta coesão, quando os seus elementos estão fortemente relacionados. • Acoplamento caracteriza a relação de um módulo com os outros módulos que compõem um sistema. • Dinâmica de alta freqüência x Dinâmica de baixa freqüência UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 50 Princípios da Engenharia de Software... • [4] Abstração: é um processo em que identificamos os aspectos importantes de um fenômeno e ignoramos os detalhes. • Uma abstração denota as características essenciais de um objeto, que o distingüe de todos os outros tipos de objetos e, assim, fornece fronteiras conceituais bem definidas, relativas à perspectiva do observador (Booch). UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 51 Princípios da Engenharia de Software... • [5] Antecipação a mudanças: é a habilidade de se projetar um sistema, já tendo em vista possíveis alterações futuras a serem incorporadas ao mesmo, de forma que estas alterações possam ser facilmente absovidas e implementadas. • Basicamente, as alterações prováveis devem ser isoladas em partes (regiões) específicas do software, de modo que as alterações fiquem restritas a pequenas partes. • É um princípio utilizado para se atingir a evolvability. • Reusability pode ser vista como evolvability em baixa granuralidade, i.e. evolvability a nível de componente. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 52 Princípios da Engenharia de Software... • Antecipação a mudanças requer o uso de ferramentas adequadas para se gerenciar as diferentes configurações do sistema que co-existirão em um dado instante. • Configuration management • Capacidade para armazenar e recuperar documentação, módulos-fonte, módulosobjeto, etc. • Antecipação a mudanças também afeta o processo de desenvolvimento de software (ex.: personnel turnover). UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 53 Princípios da Engenharia de Software... • [6] Generalidade: sempre que colocados frente a um problema específico devemos procurar descobrir a solução para um problema mais geral, do qual o problema que se procura solucionar é uma instância particular. • A solução mais geral poderá ser reutilizada em outros contextos; • Eventualmente poder-se-á encontrar um software off-the-shelf que seja a solução para o problema dado; • A solução mais geral pode ser mais cara; • Avaliar o trade-off: generalidade x (custo + eficiência) UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 54 Princípios da Engenharia de Software... • [7] Incrementabilidade: caracteriza um processo que progride passo a passo, em incrementos. A meta desejada é alcançada por aproximações sucessivas cada vez mais próximas. Cada aproximação é alcançada através de um incremento à aproximação anterior. • Significa que o software deve ser o produto final de um processo evolutivo. • Uma forma de se aplicar este princípio consiste em se identificar, ainda no início, subsets da aplicação, que possam ser desenvolvidas e entregues aos usuários, de modo a se ter um feedback antecipado... UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 55 Princípios da Engenharia de Software... • A motivação para a incrementabilidade é que, na maior parte dos casos práticos, não há como se obter todos os requisitos de um sistema antes que a aplicação seja desenvolvida. • Incrementabilidade e antecipação a mudanças estão interligadas e são as bases da evolvability. • Estágios intermediários da aplicação podem ser vistos como protótipos. • O desenvolvimento evolutivo de software requer cuidados especiais com a gerência da documentação, dos programas, dos dados de teste, etc. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 56 Software Design (Projeto)... • O projeto de software é uma atividade fundamental no processo que progressivamente transforma os requisitos do sistema, através de vários estágios intermediários, em um produto final. • Software Design é uma decomposição de um sistema em módulos, a descrição do que cada módulo deverá fazer e a descrição do tipo de relações existentes entre os módulos. • O produto final do design é a arquitetura do software. • Aplicam-se os vários princípios da Engenharia de Software UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 57 Software Design (Projeto)... UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 58 Software Design (Projeto)... • Para se ter projetos de qualidade: – Cuidadosa definição da estrutura modular e das relações existentes entre os módulos – Escolha de critérios apropriados para se decompor um sistema em módulos. • Um dos critérios é information hiding • O Design é mapeado em programas, que correspondem à sua implementação. • Não há receitas gerais que possam ser aplicadas em todas as circunstâncias. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 59 Objetivos do Software Design... • A decomposição de um sistema em módulos pode se dar de diversas formas. • Quando um módulo M é decomposto em outros módulos, diz-se que estes módulos implementam M. • Top down design: A implementação é realizada através de uma decomposição recursiva em módulos, até que a implementação possa ser diretamente realizada em termos de uma linguagem de programação. • Botton-up design: o processo de design consiste na definição de módulos que possam ser interativamente combinados para juntos formar um subsistema. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 60 Metas importantes do Software Design 1. Antecipação a mudanças – a idéia é produzir um projeto de software que possa facilmente acomodar alterações futuras. A experiência prévia do engenheiro de software e um profundo entendimento do domínio do problema pelo usuário final são fundamentais na identificação de áreas em potencial sujeitas a mudanças e na futura evolução do sistema. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 61 Antecipação a mudanças... a) Mudanças de algoritmos – para aumentar a performance do sistema, ou lidar com um caso mais geral, etc. Ex.: algoritmo de sort – o melhor algoritmo a ser aplicado dependerá do tamanho da lista a ser classificada, da distribuição dos dados na lista, etc. Conseqüentemente a escolha do melhor algoritmo dependerá de dados experimentais a serem adquiridos após o sistema estar operacional. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 62 Antecipação a mudanças... b) Mudança na representação de dados: UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 63 Antecipação a mudanças... c) Mudança da máquina virtual (abstrata): Máquina virtual: conjunto de serviços oferecidos em um determinado nível i de programação e que são utilizados por módulos de um nível mais elevado – i+1. Ex.: uso de novas versões de linguagens, sistemas gerenciadores de banco de dados, sistemas operacionais, etc. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 64 Antecipação a mudanças... d) Mudança de dispositivos periféricos: caso especial de alterações efetuadas em embedded systems em que existem diversos tipos de “dispositivos periféricos”. e) Mudanças no ambiente social: ex.: alterações em legislações específicas, na moeda, etc. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 65 Famílias de Programas... 2. Famílias de Programas – ao invés de se considerar as diferentes versões de um software produto como diferentes produtos, consideram-se estas versões como membros de uma mesma família de produtos com muito em comum e que são apenas parcialmente diferentes. Exs.: a) um software com versões em diferentes línguas. b) um sistema gerenciador de banco de dados distribuído para diferentes sistemas operacionais. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 66 Famílias de Programas... 1 1 1 2 2 2 3 3 3 4 5 UERJ Setembro 2001 4 5 © Oscar Luiz Monteiro de Farias 6 7 67 Técnicas de Modularização... • Módulo: fragmento de software que corresponde a mais que simplesmente uma rotina. Pode ser um conjunto de rotinas, de dados, de definição de tipos, ou uma combinação destes elementos. • Um módulo pode ser visto como um fornecedor de recursos e/ou serviços computacionais. • Existem relações de diversos tipos entre módulos: ordem de desenvolvimento, importância relativa, parte de, uso de facilidades providas por outros módulos, etc. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 68 Técnicas de Modularização... • Seja S um sistema de software composto dos módulos M1, M2, ..., Mn. Uma relação r em S é um subconjunto de S x S. Se dois módulos Mi e Mj estão em S, representamos o fato de que o par < Mi, Mj > está em r, usando a notação infixa Mi r Mj. • A relação r é irreflexiva, i.e., Mi r Mi não pode valer para qualquer módulo Mi em S. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 69 Técnicas de Modularização... • O fechamento transitivo (transitive closure) de uma relação r em S é uma relação em S, denotada por r+. Sejam Mi e Mj dois elementos de S. Então r+ pode ser recursivamente definida como se segue: Mi r+ Mj se e somente se (sss) Mi r Mj ou existe um elemento Mk em S, tal que Mi r Mk e Mk r+ Mj. • O fechamento transitivo captura a noção intuitiva de relações diretas e indiretas. • Para dois módulos A e B, A CALL+ B, implica que A CALL B diretamente ou através de uma cadeia de CALLs. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 70 Técnicas de Modularização... • Uma relação pode ser representada como um grafo dirigido cujos nodos são elementos de S e em que um arco dirigido existe de um nodo Mi para um nodo Mj sss Mi r Mj. • Uma relação é uma hierarquia sss não existem ciclos no grafo da relação (grafo dirigido acíclico – directed acyclic graph – dag). • USES, IS_COMPONENT_OF, INHERITS_FROM UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 71 Grafo Geral e dag M1 M1 M1,1 M2 M1,2 M1,3 M3 M1,2,1 M1,2,2 M4 M5 M1,2,1,1 M3 M3 M6 M4 UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 72 A Relação USES... • Dados dois módulos distintos Mi e Mj, diz-se que Mi USES Mj sss a correta execução de Mj é necessária para que Mi complete a tarefa descrita em sua especificação. • Se Mi USES Mj, diz-se que Mi é um cliente de Mj, visto que Mi requer os serviços que Mj provê. • A relação USES não é equivalente a conter chamadas a procedimentos • Exs.: tasks que cooperam através troca de mensagens; módulos que compartilham uma mesma estrutura de dados; UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 73 A Relação USES... • Uma boa restrição à relação USES é a de que seja uma hierarquia. • Separation of concerns poderia ser aplicada ao “percorrer-se” a relação USES. • Além disso, se a estrutura de USES não for hierárquica ter-se-á um ciclo e uma sitema em que “nada funciona, até que tudo funcione”. • A restrição da estrutura de USES ser hierárquica define um sistema através de sucessivos níveis de abstração. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 74 A Relação USES... • Def.: Nível de um módulo: O nível de um módulo que não é usado por nenhum outro módulo é zero, e o nível de qualquer outro módulo M é i, onde i é o comprimento do maior caminho no dag que conecta um módulo de nível zero ao nodo M. • Conceito de Máquinas Virtuais (Abstratas) • A relação entre módulos é definida estaticamente, i.e. é independente da execução do software. Ex.: M USES M1 e M USES M2 if cond then proc_1 else proc_2 UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 75 A Relação USES... • fan-in: número de arestas que incidem (entram) em um nodo • fan-out: número de arestas que saem de um nodo • Um alto fan-in seria um indicativo de um bom design, pois indicaria um alto grau de reuso de um módulo. • O fan-out deve ser mantido baixo. • A relação USES não é suficiente para avaliar a qualidade de um projeto (design). • É preciso analisar-se a natureza da interação entre os módulos. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 76 A Relação IS_COMPONENT_OF... • Seja S um conjunto de módulos. Para quaisquer Mi e Mj em S, Mi IS_COMPONENT_OF Mj significa que Mj é realizado através da agregação de vários módulos, um deles sendo Mi. • COMPRISES é definido como a relação inversa de IS_COMPONENT_OF. • Para quaisquer dois elementos Mi e Mj em S, diz-se que Mi COMPRISES Mj sss Mj IS_COMPONENT_OF Mi. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 77 A Relação IS_COMPONENT_OF... • Seja MS,i um subconjunto de S definido como se segue: MS,i = {Mk | Mk está em S e Mk IS_COMPONENT_OF M} Então pode-se dizer que Mi IS_COMPOSED_OF MS,i e, alternativamente, que MS,i IMPLEMENTS Mi. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 78 IS_COMPONENT_OF X COMPRISES IS_COMPONENT_OF M7 M8 M9 M5 M2 M3 M1 UERJ Setembro 2001 M4 COMPRISES M6 M1 M2 M3 M4 M7 M8 M9 M5 M6 © Oscar Luiz Monteiro de Farias 79 Information Hiding... • As relações USES e IS_COMPONENT_OF fornecem apenas uma descrição grosseira da arquitetura de um software. • Quando um módulo Mi que usa o módulo Mj é refinado em seus módulos constituintes Mi, 1, Mi, 2, ..., Mi, n é necessário esclarecer o que a relação USES entre o conjunto {Mi1, Mi,2, ..., Mi,n} e Mi significa. • O ideal seria subdividir-se um sistema em componentes tal que cada componente pudesse ser projetado independentemente dos outros componentes. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 80 Information Hiding... Interface Implementation UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 81 Information Hiding... • Interface: conjunto de serviços que um módulo disponibiliza aos seus clientes. • Estes serviços são exportados pelo módulo e importados pelos clientes. • Implementation: a forma pela qual estes serviços são realizados pelo módulo. • A interface é uma abstração do módulo do ponto de vista de seus clientes. • A implementação de um módulo é a decomposição do módulo em seus componentes pela relação IS_COMPONENT_OF, ou a sua codificação em uma LP. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 82 Information Hiding... • Information Hiding: o cliente conhece os serviços oferecidos apenas pela interface. A implementação é totalmente oculta. • Um aspecto crucial da atividade de design é a decisão sobre o que deve ser visível em um módulo (interface) e o que deve permanecer oculto (implementation). • Se a interface não se altera, pode-se realizar alterações na implementation sem afetar os clientes. UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 83 Information Hiding... UERJ Setembro 2001 © Oscar Luiz Monteiro de Farias 84