Técnicas de Projeto e Implementação de Sistemas I Lista de Exercícios Para a P2 1. Explique o conceito de padrões de projeto e o diferencie dos Frameworks e APIs. 2. Explique o conceito de composição em projeto orientado a objetos. 3. Compare o conceito de composição à herança. 4. Explique o conceito de delegação. 5. Explique como funciona e qual é a aplicabilidade do padrão Singleton. 6. Explique como funciona e qual é a aplicabilidade do padrão Factory Method. 7. Explique como funciona e qual é a aplicabilidade do padrão Abstract Factory. 8. Explique como funciona e qual é a aplicabilidade do padrão Decorator. 9. Explique como funciona e qual é a aplicabilidade do padrão Observer. 10. Explique como funciona e qual é a aplicabilidade do padrão Command. 11. Explique como funciona e qual é a aplicabilidade do padrão Strategy. 12. Explique como funciona e qual é a aplicabilidade do padrão Adapter. 13. Explique como funciona e qual é a aplicabilidade do padrão Facade. 14. Explique como funciona e qual é a aplicabilidade do padrão Iterator. 15. Explique como funciona e qual é a aplicabilidade do padrão Composite. 16. O método Array.sort() disponível na linguagem Java é um exemplo do padrão Strategy. Explique por que? 17. Considere um jogo que dá suporte ao usuário mapear botões do Joystick a ações do personagem (e.g., se mover para frente, para a direita, pular). Como desenvolvedores do jogo, queremos ter uma solução com baixo acoplamento entre o tratador de eventos (módulo que recebe a informação sobre o botão ter sido pressionado) e as ações em si. Qual padrão de projeto você utilizaria para alcançar este objeto? Descreva textualmente como esta implementação seria estruturada.
18. Considere uma sistema de telemetria para um carro de Fórmula 1. Este sistema deve exibir em múltiplas interfaces (e.g., monitor nos boxes, página na Internet) as informações relevantes do carro: velocidade atual, consumo de combustível, desgaste dos pneus. Qual padrão de projeto você utilizaria para implementar este aspecto do sistema? 19. Considere um editor de desenhhos que permite ao usuário desenhar elementos gráficos como linhas, polígonos e texto, em figuras e diagramas. A abstração chave é o conceito de objeto gráfico: uma forma editável e capaz de se desenhar, representada por uma interface chamada Shape. A interface Shape propõe três métodos: BoundingBox(): retorna um retângulo que descreve a caixa envolvente da forma. CreateManipulator(): retorna uma instância de um objeto capaz de manipular a forma de modo apropriado. Draw(): desenha a forma. Há duas implementações da interface Shape no sistema: PolygonShape e LineShape. Desejamos adicionar uma terceira, o TextShape. Entretanto, o código do TextShape é complexo e há uma API que disponibiliza uma classe denominada TextView com as mesmas funcionalidades necessárias. A desvantagem desta API é que seus métodos são chamados de GetExtent() (ao invés de BoundingBox()) e Display() (ao invés de Draw()). Como podemos utilizar a API neste caso? Qual padrão de projeto auxiliaria nesta tarefa? Desenhe um diagrama de classes que ilustre a sua solução. 20. Considere a seguinte afirmação: o padrão Abstract Factory, quando usado corretamente, reduz o acoplamento. Esta afirmação é verdadeira? Explique. 21. Considere a seguinte afirmação: em uma implementação típica do padrão Abstract Factory, implicitamente, utilizamos o padrão Factory Method. Você considere esta afirmação verdadeira? Explique. 22. Considere um sistema que precise escrever eventos em um arquivo de log. Cada linha do arquivo de log contém a descrição de um evento. A descrição de um evento pode conter vários tipos de informação que podem ou não ser relevantes para um usuário específico (e.g., data e hora, módulo que gerou o evento, nome da função que gerou o evento, número da linha executada quando o evento foi gerado, temperatura da CPU quando o evento ocorreu). Além destas informações, um evento sempre tem uma descrição textual. Suponha que desejamos permitir que cada usuário defina as informações que quer ver nos logs dos eventos. Elabore uma solução baseada no padrão Decorator. Apresente o diagrama de classes e esboce o código fonte em Java da implementação. 23. Em uma grande empresa, há uma equipe especializada para lidar com problemas na área de TI. Cada membro desta equipe possui conhecimento para atender a alguns tipos específicos de problemas (e.g., problemas na infraestrutura de rede, problemas de software, problemas de hardware, problemas nos servidores). Quando algum funcionário da empresa tem um
problema de TI, ele acessa uma página web e preenche um formulário com os dados do problema, incluindo o tipo. O sistema recebe esta queixa e repassa o problema para todos os funcionários habilitados a tratar aquele tipo de problema. Este repasse basicamente resulta em uma mensagem ser exibida no monitor do membro da equipe de TI correspondente. Qual dos padrões estudados em sala de aula é adequado a este cenário? Esboce um diagrama de classes ilustrando como este padrão pode ser aplicado. 24. Um gerenciador de desktop é um aplicativo que gerencia a área de trabalho de um usuário em um ambiente gráfico. Este aplicativo exibe algumas ferramentas básicas ao usuário, como uma barra dos programas atualmente abertos, um relógio, uma barra com um menu de programas disponíveis no sistema e a área de trabalho em si (com um papel de parede, ícones, etc). Suponha que queremos desenvolver um gerenciador de desktop. Para cada tipo de ferramenta (e.g., barra com menu, barra de programas abertos), teremos múltiplas versões disponíveis (na forma de classes). Ao ser inicializado, o gerenciador de desktop lerá configurações de um arquivo e escolherá, para cada tipo de ferramenta, a versão preferida pelo usuário. Toda vez que o usuário interagir com o desktop (com o mouse), o gerenciador identificará a qual ferramenta a interação corresponde e repassará o comando para ela. Qual padrão de projeto pode ser utilizado para este sistema? Esboce uma solução no forma de um diagrama de classes. 25. A maioria dos bancos possui hoje aplicativos para smartphones. Estes aplicativos permitem que seus clientes façam operações bancárias, como obtenção de extratos, transferências, DOCs, TEDs, pagamento de boletos, aplicações e etc. Suponha que um determinado banco, que já possui uma aplicação deste tipo, quer permitir que terceiros desenvolvam plugins para a realização de compras e pagamentos. Por exemplo, se uma livraria desenvolve um aplicativo de compras, este pode ser integrado ao aplicativo do banco através de um plugin permitindo que com um clique na tela o cliente efetue o pagamento através de uma transferência bancária. Este plugin receberia o valor da compra e os dados bancários da loja e, acessando o aplicativo do banco faria a transferência, observando o saldo disponível e os dados de autenticação do cliente. O sistema do banco, no entanto, é complexo e esta simples tarefa exige a instanciação e manipulação de várias classes em uma ordem específica. O que o banco poderia fazer, em seu aplicativo, para que os plugins pudessem realizar este tipo de operação de forma mais simples? Qual padrão de projeto visto em sala de aula poderia auxiliar nesta tarefa? Esboce um diagrama de classes para esta solução. 26. Considere um sistema de gerência de pessoal em uma empresa. Esta empresa organiza seus empregaods em uma hierarquia: cada empregado pode ser responsável por zero ou mais empregados subalternos. Há 4 tipos de empregados: presidentes, vice-presidentes, gerentes e outros. Todo empregado tem um nome, um CPF um edereço de e-mail e um salário. Nosso sistema deve ser capaz, entre outras coisas, de: contabilizar o custo total (soma dos salários) de todos os funcionários abaixo de um dado funcionário na hierarquia.
permitir que um funcionário envie um e-mail para todos os funcionários abaixo dele próprio na hierarquia. Dentre os padrões de projeto vistos em sala de aula, qual poderia ser utilizado para implementar esta parte do sistema? Esboce um diagrama de classes da solução e as implementações em Java dos métodos custototal() (que contabiliza o custo total em relação a um empregado) e enviaemail() (que envia um e-mail a partir de um empregado), ambos da classe Empregado. 27. Considere a solução da questão anterior. Vários módulos do sistema precisam percorrer a estrutura de dados contendo todos os funcionários (por exemplo, para fazer a folha de pagamento, para gerar relatórios, etc). Os percorrimentos precisam ser realizados de acordo com vários critérios. Por exemplo, há módulos distintos para gerar as folhas de pagamento dos gerentes, dos vice-presidentes e dos outros funcionários. Há ainda um módulo que precisa percorrer os empregados por ordem de nível na hierarquia: primeiro o presidente, depois seus sobordinados diretos, depois os subordinados diretos destes, e assim sucessivamente. Proponha uma solução que permita que estes vários módulos sejam desacoplados da estrutura de dados que armazena os empregados. Qual padrão de projeto é utilizado para isso? Esboce o código em Java da sua solução. 28. Considere uma aplicação que precisa enviar dados pela porta serial do computador. A aplicação têm vários módulos que, em momentos variados, necessitam escrever na porta serial. Por uma limitação do sistema operacional, o dispositivo correspondente à porta não pode ser aberto várias vezes simultaneas. Como solução, criamos a seguinte classe: public class SerialPort { SerialPort sp = null; private SerialPort() { } // Requisita ao SO a abertura do dispositivo. public SerialPort getinstance() { } if (sp == null) sp = new SerialPort(); return(this); public void write(string msg) { // Escreve msg na porta serial.
} } Sobre esta classe: a) Qual padrão de projeto é utilizado? b) Por que o construtor é declarado como sendo privado? c) Se há múltiplas threads no sistema, o método write() permite concorrência? I.e., é possível que uma thread seja preemptada dentro deste método e, neste momento, outra comece a executá-lo? 29. Considere o seguinte diagrama de classes: 30. Dê exemplos de padrões de projeto de criação. 31. Dê exemplos de padrões de projeto estruturais. 32. Por que o MVC é considerado um padrão composto? 33. Descreva os personagens envolvidos no padrão MVC e suas colaborações. 34. Os padrões de projeto são uma técnica de reúso de código? Explique. 35. O que é um framework? Como eles funcionam? Quais as diferenças entre um framework e uma biblioteca? 36. Como funciona o paradigma de linha de produto? 37. No paradigma de linha de produto, o que é a plataforma? Qual a diferença entre uma plataforma e um framework? 38. Explique o conceito de personalização em massa.
39. Suponha que um cliente requisite o desenvolvimento um determinado tipo de software com o qual sua empresa não tem experiência. Seu gerente sugere a adoção do paradigma de desenvolvimento baseado em linha de produto. Esta é uma boa ideia? Sob quais condições? 40. Quais são os potenciais benefícios do paradigma de linha de produto na engenharia de software?