·

Cursos Gerais ·

Engenharia de Software

Send your question to AI and receive an answer instantly

Ask Question

Preview text

1 Qual princípio de projeto é violado pelo seguinte código void onclick num1 textfield1value c1 BDgetContanum1 num2 textfield2value c2 BDgetContanum2 valor textfield3value beginTransaction try c1retiravalor c2depositavalor commit catch rollback 2Marque a alternativa falsa refactorings melhoram o projeto de um sistema de software refactorings tornam o código de um sistema mais fácil de ser entendido refactorings facilitam a localização e a correção de bugs futuros refactorings aceleram a implementação de novas funcionalidades refactorings melhoram o desempenho de um sistema em termos de tempo de execução 3 Descreva as diferenças entre refactorings oportunistas e refactorings planejados Qual dessas formas de refactoring deve ser mais comum 4 No exemplo a seguir extraia o código comentado com a palavra extrair para um método g class A void f int x 10 x print x extrair 5 A seguinte função calcula o nésimo termo da sequência de Fibonacci O primeiro termo dessa sequência é 0 o segundo termo é 1 e a partir daí o nésimo termo é a soma dos dois termos anteriores int fibint n if n 1 return 0 if n 2 return 1 return fibn1 fibn2 Descreva clones dos Tipos 1 2 3 e 4 para essa função Não precisa implementar o código do clone mas seja bem preciso na sua resposta ao indicar as diferenças entre cada clone e o código acima 6 Cite pelo menos 3 vantagens e 3 problemas relacionadas ao Reuso de Software 7 Cite e explique quatro abordagens que apoiam o reuso de software 8 Costumase afirmar que existem três conceitos chaves em orientação a objetos encapsulamento polimorfismo e herança Suponha que você tenha sido encarregado de projetar uma nova linguagem de programação Suponha ainda que você poderá escolher apenas dois dos três conceitos que mencionamos Qual dos conceitos eliminaria então da sua nova linguagem Justifique sua resposta 9Quais são as principais características dos componentes de software reutilizáveis 10 Push UpPush Down de métodos são refactorings possíveis em qualquer linguagem de programação imperativa Verdadeiro Falso 1 O princípio de design violado pelo código é o Princípio da Responsabilidade Única Single Responsibility Principle SRP Esse princípio afirma que uma classe ou método deve ter apenas uma única responsabilidade ou tarefa ou seja ele deve ser responsável por fazer uma única coisa e fazêla bem No código apresentado a função onclick está realizando múltiplas tarefas obtendo os valores dos campos de entrada acessando o banco de dados iniciando e terminando uma transação realizando operações de saque e depósito em contas Essas tarefas deveriam ser divididas em funções separadas e mais especializadas cada uma com uma única responsabilidade Ao violar o SRP o código se torna mais difícil de manter e testar além de aumentar o acoplamento e a complexidade do código 2 A alternativa falsa é refactorings melhoram o desempenho de um sistema em termos de tempo de execução Embora alguns refactorings possam melhorar o desempenho do sistema em alguns casos isso não é uma garantia Na maioria dos casos o objetivo dos refactorings é melhorar a qualidade do código tornálo mais fácil de entender manter e evoluir e não necessariamente melhorar o desempenho do sistema 3 Refactorings oportunistas ocorrem quando um desenvolvedor aproveita uma oportunidade enquanto trabalha em uma parte específica do código para fazer melhorias pontuais na estrutura ou na clareza deste código sem um plano predefinido Essas melhorias são geralmente pequenas e podem incluir a extração de um método a renomeação de uma variável ou a eliminação de código duplicado Por outro lado os refactorings planejados são um processo sistemático e planejado de melhorias no código de um sistema de software Eles são realizados de acordo com um plano predefinido e geralmente envolvem alterações em uma parte mais ampla do código Isso pode incluir a reorganização de pacotes a criação de padrões de design mais adequados a eliminação de código desnecessário ou a separação de responsabilidades Ambos os tipos de refatoração têm seus benefícios Refactorings oportunistas são rápidos fáceis de implementar e podem melhorar a clareza do código em pequenas etapas Refactorings planejados por outro lado podem abordar problemas mais complexos e abrangentes proporcionando melhorias significativas na estrutura geral do sistema Em termos de qual deve ser mais comum isso pode depender da situação e das necessidades do projeto Refactorings oportunistas são adequados para melhorias pontuais no código enquanto refactorings planejados são mais adequados para melhorias em grande escala na arquitetura do sistema Portanto pode ser mais comum realizar refactorings oportunistas durante o desenvolvimento diário do código enquanto refactorings planejados são realizados em momentos específicos como parte de uma estratégia de melhoria contínua 4 Segue abaixo o código com o trecho comentado extraído para um método chamado imprimirX class A void f int x 10 x imprimirXx void imprimirXint x Systemoutprintlnx 5 Tipos de clones Clone exato Um clone exato seria uma cópia exata do código acima sem nenhuma modificação Clone com mudança de nome de variável Esse clone seria igual ao código original exceto por uma mudança de nome de variável Por exemplo a variável n poderia ser renomeada para fibonacciIndex Clone com mudança de constante Esse clone seria igual ao código original exceto por uma mudança na definição dos valores iniciais da sequência de Fibonacci Por exemplo o primeiro termo poderia ser definido como 1 e o segundo como 2 Clone com mudança de operação Esse clone seria igual ao código original exceto por uma mudança na operação utilizada para calcular o nésimo termo da sequência Por exemplo em vez de usar a soma dos dois termos anteriores poderia ser usada a multiplicação Isso resultaria em uma sequência de Fibonacci diferente da original 6 Vantagens do Reuso de Software 1 Redução de custos e tempo reutilizar componentes de software já existentes pode reduzir significativamente o tempo e os custos de desenvolvimento de novos projetos Em vez de começar do zero os desenvolvedores podem usar componentes já testados e validados 2 Melhoria da qualidade a reutilização de componentes de software já testados e validados pode melhorar a qualidade do software final Os componentes reutilizados já passaram por testes rigorosos em outros projetos o que significa que são menos propensos a conter bugs e erros 3 Facilidade de manutenção componentes de software reutilizáveis são geralmente bem documentados e testados o que facilita a manutenção do software Quando um componente é atualizado ou corrigido essas mudanças podem ser facilmente aplicadas a todos os projetos que utilizam este componente Problemas do Reuso de Software 1 Dificuldade de encontrar componentes adequados pode ser difícil encontrar componentes de software que sejam adequados para o projeto em questão Os componentes podem não ser compatíveis com as tecnologias e plataformas usadas no projeto ou podem não atender aos requisitos específicos do projeto 2 Dependência de terceiros quando o software reutilizado é fornecido por terceiros o projeto se torna dependente da qualidade disponibilidade e suporte desse software Se o fornecedor do software reutilizado deixar de oferecer suporte ou atualizações o projeto pode enfrentar problemas significativos 3 Complexidade a reutilização de software pode aumentar a complexidade do projeto especialmente se os componentes reutilizados não forem bem documentados ou mal projetados Isso pode tornar o software mais difícil de entender depurar e manter 7 Existem várias abordagens que podem ser usadas para apoiar o reuso de software e aqui estão quatro exemplos Orientação a objetos a orientação a objetos é uma abordagem de programação que enfatiza a criação de objetos reutilizáveis que podem ser usados em diferentes contextos Os objetos são criados a partir de classes que definem os atributos e comportamentos dos objetos Ao criar objetos reutilizáveis a orientação a objetos ajuda a promover o reuso de software Bibliotecas de software as bibliotecas de software são coleções de código reutilizável que podem ser usadas em diferentes projetos As bibliotecas podem incluir funções classes módulos e outros componentes de software que podem ser usados para realizar tarefas específicas As bibliotecas de software são amplamente utilizadas na programação para apoiar o reuso de software Padrões de projeto os padrões de projeto são soluções comprovadas para problemas de programação comuns Eles descrevem as melhores práticas para resolver problemas específicos e fornecem um modelo para o desenvolvimento de software Os padrões de projeto são frequentemente usados para criar componentes de software reutilizáveis e ajudar a promover o reuso de software Arquiteturas de software baseadas em componentes as arquiteturas de software baseadas em componentes são projetadas para criar sistemas de software usando componentes reutilizáveis Os componentes são projetados para serem independentes uns dos outros e podem ser combinados para criar sistemas de software complexos As arquiteturas de software baseadas em componentes são amplamente utilizadas na engenharia de software para apoiar o reuso de software 8 Se eu tivesse que eliminar um dos três conceitoschave da orientação a objetos para minha nova linguagem de programação eu eliminaria a herança Embora a herança seja um conceito poderoso na orientação a objetos é possível desenvolver um sistema orientado a objetos sem usar herança O encapsulamento e o polimorfismo são conceitos fundamentais e complementares que permitem que os objetos interajam de maneira segura e eficiente O encapsulamento permite que os objetos ocultem seus detalhes internos e se comuniquem com outros objetos por meio de uma interface bem definida Isso ajuda a garantir a integridade dos dados e a facilitar a manutenção do código O polimorfismo permite que os objetos sejam tratados de maneira uniforme independentemente de sua classe específica Isso significa que um objeto pode ser usado em diferentes contextos e interagir com outros objetos de maneira flexível e adaptável Portanto eliminaria a herança uma vez que é possível criar objetos com comportamentos e características diferentes sem usar herança mas sem encapsulamento e polimorfismo a programação orientada a objetos seria limitada e menos eficiente 9 Os componentes de software reutilizáveis são geralmente caracterizados por possuírem as seguintes características Modularidade os componentes são projetados para serem independentes de modo que possam ser usados em diferentes contextos e projetos Abstração os componentes são projetados para fornecer uma interface abstrata que oculta a complexidade interna do componente e permite que os usuários se concentrem em seu comportamento externo Encapsulamento os componentes são projetados para ocultar seu estado interno e fornecer uma interface clara e definida para a interação com o componente Composição os componentes podem ser combinados em sistemas maiores e mais complexos permitindo que os desenvolvedores construam soluções personalizadas a partir de componentes existentes Reusabilidade os componentes são projetados para serem reutilizáveis o que significa que podem ser usados em diferentes projetos e contextos sem a necessidade de reescrever o código Documentação os componentes geralmente são acompanhados por documentação clara e detalhada que descreve como eles funcionam como usálos e quais são suas limitações e requisitos 10 Falso Os refactorings Push Up e Push Down são técnicas comuns de refatoração de código em linguagens de programação orientadas a objetos nas quais é possível manipular hierarquias de classes Esses refactorings visam mover métodos de uma classe para sua superclasse Push Up ou para uma subclasse Push Down a fim de melhorar a estrutura e organização do código Em linguagens de programação imperativas como C e Pascal não há o conceito de herança de classes e portanto não é possível aplicar esses tipos de refactorings No entanto outras técnicas de refatoração de código podem ser aplicadas em linguagens imperativas para melhorar a qualidade e manutenção do código