Prévia do material em texto
UAM – Arquitetura de software – Unidade 3 – Pratique Projeto de software baseado em padrões Projetar software orientado a objetos é difícil e projetar software orientado a objetos reutilizáveis é ainda mais. Você deve encontrar objetos pertinentes, fatorá-los em classes na granularidade correta, definir interfaces de classes e hierarquias de herança e estabelecer relacionamentos-chave entre eles. Seu design deve ser específico para o problema em questão, mas também geral o suficiente para resolver problemas e requisitos futuros. Você também deseja evitar o reprojeto, ou pelo menos minimizá-lo. Desenvolvedores experientes dirão que um design reutilizável e flexível é difícil, senão impossível, de acertar na primeira vez. Antes de um design terminar, eles geralmente tentam reutilizá-lo várias vezes, modificando-o a cada ocasião. No entanto, desenvolvedores experientes fazem bons projetos. Enquanto isso, os novos profissionais ficam impressionados com as opções disponíveis e tendem a recorrer às técnicas não orientadas a objetos que usaram antes. Demora muito tempo para os iniciantes aprenderem o que é um bom design orientado a objetos. Desenvolvedores experientes evidentemente sabem algo que os inexperientes não conhecem. O que é isso? Uma coisa que os especialistas entendem que não deve fazer é resolver todos os problemas, desde os primeiros princípios. Em vez disso, eles reaproveitam soluções que funcionaram para eles no passado. Quando encontram um bom recurso, usam-no repetidamente. Essa experiência faz parte do que os torna especialistas. Consequentemente, você encontrará padrões recorrentes de classes e objetos de comunicação em muitos sistemas orientados a objetos. Esses padrões resolvem problemas de design específicos e tornam os designs orientados a objetos mais flexíveis, elegantes e, finalmente, reutilizáveis. Eles ajudam os designers a reutilizar projetos bem-sucedidos, baseando-os na experiência anterior. Um designer familiarizado com esses padrões pode aplicá-los imediatamente a problemas de design sem precisar redescobri-los. Uma analogia ajudará a ilustrar o ponto. Romancistas e dramaturgos raramente projetam suas tramas do zero. Em vez disso, seguem padrões como "Herói tragicamente imperfeito" (Macbeth, Hamlet etc.) ou "O romance romântico" (inúmeros romances). Da mesma forma, os designers orientados a objetos seguem padrões como representar estados com objetos e modificar objetos para que você possa adicionar/remover recursos com facilidade. Depois de conhecer o padrão, muitas decisões de design são seguidas automaticamente. Todos sabemos o valor da experiência em design. Quantas vezes você teve um déjà - vu , aquela sensação de que já havia resolvido um problema antes, mas sem saber exatamente onde ou como? Se você se lembra dos detalhes do problema anterior e como o resolveu, poderá reutilizar a experiência em vez de redescobri-la. No entanto, não fazemos um bom trabalho de gravação de experiência em design de software para outras pessoas usarem. Cada padrão de design nomeia, explica e avalia sistematicamente um design importante e recorrente em sistemas orientados a objetos. Nosso objetivo é capturar a experiência de design de uma forma que as pessoas possam usar de maneira eficaz. Para esse fim, documentamos alguns dos padrões de design mais importantes e os apresentamos como um catálogo. Os padrões de design facilitam a reutilização de projetos e arquiteturas de sucesso. Expressar técnicas comprovadas como padrões de design permitem que elas se tornem mais acessíveis aos desenvolvedores de novos sistemas. Os padrões de design ajudam a escolher alternativas de design que convertem um sistema reutilizável e evitam alternativas que comprometem a reutilização. Os padrões de design podem até melhorar a documentação e a manutenção dos sistemas existentes, fornecendo uma especificação explícita das interações de classe e objeto e sua intenção subjacente. Simplificando, os padrões de design ajudam um designer a obter um design correto mais rapidamente. Nesse contexto, utilizar padrões de projetos (ou padrões de design ou design patterns) melhora a qualidade do software a ser construído e facilita o projeto arquitetural. Vamos Praticar Baseado no caso mencionado acima, como os padrões de projetos de software podem ser utilizados para que melhore a qualidade do software e o projeto de arquitetura? Além disso, de que maneira os padrões de projeto permitem a criação de arquiteturas robustas? Ao final, disponibilize seu trabalho no fórum da seção. Resposta: Os padrões de projeto de software são soluções comprovadas para problemas recorrentes no desenvolvimento de software. Eles podem ser utilizados para melhorar significativamente a qualidade do software e o projeto de arquitetura de várias maneiras. Vou explicar como os padrões de projeto contribuem para esses aspectos e como permitem a criação de arquiteturas robustas: 1. Melhoria da Qualidade do Software: a) Reutilização de Código: · Os padrões de projeto promovem a reutilização de soluções testadas e comprovadas, reduzindo a probabilidade de erros e aumentando a confiabilidade do software. b) Manutenibilidade: · Ao seguir padrões conhecidos, o código se torna mais fácil de entender e manter, pois outros desenvolvedores podem reconhecer rapidamente a estrutura e o propósito do código. c) Flexibilidade e Extensibilidade: · Muitos padrões, como o Strategy ou o Observer, são projetados para tornar o software mais flexível e fácil de estender sem modificar o código existente. d) Redução de Complexidade: · Padrões como Facade ou Adapter podem simplificar interfaces complexas, tornando o sistema mais fácil de usar e entender. e) Testabilidade: · Padrões como Dependency Injection facilitam a criação de testes unitários, melhorando a cobertura de testes e a qualidade geral do software. 2. Melhoria do Projeto de Arquitetura: a) Estruturação Clara: · Padrões arquiteturais como MVC (Model-View-Controller) ou MVVM (Model-View-ViewModel) fornecem uma estrutura clara para organizar componentes do sistema. b) Separação de Preocupações: · Padrões como Layered Architecture ajudam a separar diferentes aspectos do sistema (por exemplo, lógica de negócios, apresentação, acesso a dados), tornando a arquitetura mais modular e gerenciável. c) Escalabilidade: · Padrões como Microservices ou Event-Driven Architecture podem ser usados para criar sistemas altamente escaláveis e distribuídos. d) Interoperabilidade: · Padrões como Adapter ou Bridge podem ser usados para integrar sistemas heterogêneos ou componentes incompatíveis. e) Consistência: · O uso consistente de padrões em toda a arquitetura leva a um design mais coerente e fácil de entender. 3. Criação de Arquiteturas Robustas: a) Resiliência: · Padrões como Circuit Breaker ou Bulkhead podem ser usados para criar sistemas mais resilientes a falhas. b) Desacoplamento: · Padrões como Publish-Subscribe ou Mediator promovem o desacoplamento entre componentes, tornando o sistema mais robusto a mudanças. c) Gerenciamento de Estado: · Padrões como State ou Memento ajudam a gerenciar o estado do sistema de forma mais eficaz, reduzindo erros relacionados a estados inconsistentes. d) Concorrência: · Padrões como Thread Pool ou Producer-Consumer podem ser usados para lidar eficientemente com operações concorrentes, melhorando o desempenho e a robustez do sistema. e) Segurança: · Padrões como Proxy ou Decorator podem ser usados para adicionar camadas de segurança sem modificar o código existente. f) Tolerância a Falhas: · Padrões como Retry ou Compensating Transaction podem ser implementados para lidar com falhas de maneira graciosa e manter a integridade do sistema. g) Monitoramento e Logging: · Padrões como Observer ou Decorator podem ser usados para implementar sistemas de monitoramento e logging abrangentes, essenciais para arquiteturas robustas. Além disso, os padrões de projeto permitem a criação de arquiteturas robustas das seguintes maneiras: 1. Vocabulário Comum: · Fornecem um vocabulário comum para comunicardecisões de design complexas de forma concisa. 2. Documentação Implícita: · O uso de padrões bem conhecidos serve como uma forma de documentação implícita, tornando a arquitetura mais compreensível para novos membros da equipe. 3. Previsibilidade: · Arquiteturas baseadas em padrões conhecidos são mais previsíveis em termos de comportamento e desempenho. 4. Evolução Controlada: · Facilitam a evolução controlada do sistema, permitindo que novas funcionalidades sejam adicionadas de maneira estruturada. 5. Interoperabilidade: · Muitos padrões são projetados para trabalhar bem juntos, permitindo a criação de arquiteturas complexas a partir de blocos de construção bem compreendidos. 6. Abstração: · Fornecem níveis apropriados de abstração, permitindo que os arquitetos se concentrem em problemas de alto nível sem se perder em detalhes de implementação. 7. Validação de Design: · O uso de padrões estabelecidos serve como uma forma de validação do design, pois essas soluções já foram testadas e aprovadas pela comunidade de desenvolvimento. Em conclusão, os padrões de projeto são ferramentas poderosas que, quando aplicados adequadamente, podem melhorar significativamente a qualidade do software, aprimorar o projeto de arquitetura e permitir a criação de sistemas robustos e flexíveis. No entanto, é importante lembrar que os padrões não são soluções universais e devem ser aplicados criteriosamente, considerando o contexto específico do problema em questão. O verdadeiro poder dos padrões de projeto vem da compreensão de quando e como aplicá-los, e não apenas da sua aplicação indiscriminada.