Fala, meus consagrados! Beleza?
Padrões de projetos orientados a objetos, também conhecidos como Design Patterns, são soluções reutilizáveis e elegantes para problemas comuns encontrados no projeto de software orientado a objetos. Eles fornecem abordagens testadas e comprovadas para a criação de estruturas de código que são flexíveis, escaláveis e fáceis de entender. Os padrões de projetos não são códigos prontos, mas sim diretrizes que podem ser adaptadas e aplicadas de acordo com as necessidades específicas de um projeto.
Dos vários grupos de padrões de projetos, iremos estudar dois Padrões GRASP (General Responsibility Assignment Software Patterns) que são citados nos últimos concursos de TI: padrões Controller e Information Expert (ou apenas Expert).
Os padrões GRASP consistem em diretrizes para atribuir responsabilidade a classes e objetos em projeto orientado a objetos e fornecem uma abordagem sistemática para a atribuição de responsabilidades às classes do projeto. Foram criados com o intuito de tornar o código mais flexível, facilitando a manutenção e a extensibilidade.
Esses padrões são padrões de projeto orientados a objetos que ajudam a definir a distribuição de responsabilidades entre as classes em um sistema de software e têm objetivo de melhorar a qualidade do projeto de software e torná-lo mais flexível, extensível e fácil de manter.
Por fim, os padrões GRASP são um conjunto de diretrizes e padrões de design orientados a objetos que ajudam os projetistas de software a atribuir responsabilidades de maneira eficaz e coesa entre as classes e objetos.
Esses padrões possuem a seguinte classificação:
- Padrões Fundamentais:
- Information Expert;
- Creator;
- High Cohesion;
- Low Coupling; e
- Controller;
- Padrões Avançados:
- Polymorphism;
- Pure Fabrication;
- Indirection; e
- Protected Variations.
Figura 1: Padrões Fundamentais.
Figura 2: Padrões Avançados.
Como informado, o foco do artigo é estudarmos dois padrões fundamentais: Controller e Information Expert.
O padrão Controller (Controlador) é um dos padrões GRASP que aborda a organização da lógica de controle em um sistema. Esse padrão atribui a responsabilidade de lidar com os eventos do sistema para uma classe que representa a um cenário de caso de uso do sistema global.
O padrão Controller se concentra na designação de uma classe (ou conjunto de classes) que é responsável por receber e gerenciar solicitações de entrada do usuário ou de outros sistemas, bem como coordenar as ações e interações necessárias para lidar com essas solicitações. O objetivo é separar a lógica de controle da interface do usuário e das outras partes do sistema.
Como exemplo de uso, vamos considerar um sistema de aplicativo de lista de tarefas e como o padrão Controller pode ser aplicado:
- Podemos ter as seguintes classes:
- Task (Tarefa) representa uma única tarefa com suas informações;
- TaskList (Lista de Tarefas) mantém uma lista de tarefas e suas operações (adicionar, remover, atualizar); e
- TaskViewController (Controlador de Visualização de Tarefas) é o controlador responsável por gerenciar a interação do usuário com as tarefas;
- O TaskViewController:
- Atua como o controlador;
- Recebe solicitações de interação do usuário, como adicionar ou remover uma tarefa;
- Coordena as operações necessárias com as classes Task e TaskList;
- Mantém a lógica de coordenação separada da interface do usuário, permitindo que as tarefas sejam gerenciadas de maneira eficiente e flexível.
O padrão Controller ajuda a alcançar a separação de preocupações, onde a lógica de controle não está intimamente acoplada à interface do usuário ou à lógica de negócios. Isso torna o sistema mais organizado, fácil de manter e adaptável a mudanças futuras.
O outro padrão a ser tratado no artigo é o Information Expert (Especialista na Informação). Esse princípio diz que uma classe que possui os dados necessários para uma tarefa é a mais adequada para realizar essa tarefa. Isso promove um baixo acoplamento e uma alta coesão no design, já que as operações relacionadas aos dados estão centralizadas em um único lugar.
Esse padrão determina quando devemos delegar a responsabilidade para um outro objeto que seja especialista naquele domínio. É um princípio utilizado para determinar onde delegar responsabilidades. Essas responsabilidades incluem métodos, campos computados e assim em diante.
Uma abordagem geral para atribuir responsabilidades é olhar:
- Para uma determinada responsabilidade;
- Determinar a informação necessária para cumpri-la; e
- Determinar onde essa informação está armazenada.
Esse padrão colocará a responsabilidade na classe com a maioria das informações necessárias para cumpri-la.
Como exemplo de uso, vamos considerar um sistema de loja online e como o padrão Information Expert pode ser aplicado:
- Podemos ter as seguintes classes:
- Customer (Cliente) contém informações sobre os clientes, como nome, endereço, etc;
- Order (Pedido) contém informações sobre os produtos, como nome, preço, etc; e
- Product (Produto) representa um pedido feito por um cliente e inclui detalhes como a lista de produtos e a quantidade;
De acordo com o padrão Information Expert, a classe Order é a mais indicada para calcular o valor total do pedido. Isso ocorre porque a classe Order possui informações sobre os produtos incluídos no pedido e suas quantidades. Portanto, é a classe mais informada para realizar esse cálculo. A classe Order é o Information Expert para o cálculo do valor total do pedido, porque possui as informações necessárias (a lista de produtos e suas quantidades) para realizar essa operação.
Ao seguir o padrão Information Expert, o padrão tende a ser mais intuitivo, coeso e de fácil manutenção, pois as responsabilidades estão bem alinhadas com os dados relevantes. Isso ajuda a evitar acoplamento excessivo e a distribuição inapropriada de responsabilidades.
Espero que tenham gostado!
Forte abraço e até a próxima jornada!
_________________________
Professor Rogerão Araújo
Clique nos links abaixo:
Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
Clique no link abaixo e inscreva-se gratuitamente: