O principal sistema de informação de uma empresa, desenvolvi...

Próximas questões
Com base no mesmo assunto
Q47402 Engenharia de Software
O principal sistema de informação de uma empresa, desenvolvido internamente, contém regras de negócio no código da interface de usuário. Qual a técnica de refatoração que o arquiteto de software pode indicar para melhorar consideravelmente o sistema nesse caso?
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: B - Separate Domain from Presentation.

No contexto da engenharia de software, especialmente quando falamos sobre refatoração, buscamos melhorar a estrutura interna do código sem alterar seu comportamento externo. A ideia é deixar o sistema mais fácil de compreender, mais simples de modificar e mais robusto em relação a bugs. A questão em pauta foca em um problema comum em sistemas de informação: o entrelaçamento das regras de negócio com o código da interface de usuário.

Essa mistura pode causar complicações na manutenção e na evolução do sistema, uma vez que mudanças na interface ou nas regras de negócio podem afetar um ao outro de maneiras inesperadas. Além disso, isso viola o princípio de responsabilidade única, um dos princípios SOLID, que recomenda que um módulo, classe ou função deve ter apenas um motivo para mudar.

A técnica de refatoração indicada para resolver esse problema é a "Separate Domain from Presentation" (Alternativa B), cujo objetivo é desacoplar as regras de negócio (domínio) da interface de usuário (apresentação). Isso permite que cada parte seja modificada independentemente da outra, facilitando a manutenção e potencialmente a reutilização do código. Ao separar o domínio da apresentação, a refatoração promove uma arquitetura mais limpa, onde o domínio do negócio pode ser testado de forma isolada e a interface de usuário pode ser alterada sem risco de afetar a lógica de negócio subjacente.

Essa técnica é uma aplicação do padrão de design MVC (Model-View-Controller) ou MVP (Model-View-Presenter), que são estratégias amplamente usadas para separar a lógica de negócios da interface do usuário. Vamos olhar rapidamente as outras alternativas para entender por que não são adequadas:

  • A - Tease Apart Inheritance: Esta técnica se refere a dividir uma hierarquia de classes complexa em hierarquias mais simples e mais focadas. Não é adequada aqui porque o problema não é com a herança, mas com a mistura de camadas de responsabilidade.
  • C - Extract Hierarchy: Similar ao Tease Apart Inheritance, essa técnica envolve a criação de uma hierarquia de classes onde não existe ou é muito fraca. Novamente, isso não aborda o problema mencionado.
  • D - Convert Procedural Design to Objects: Essa técnica é usada para transformar um design procedural em um orientado a objetos, mas o problema não é o paradigma de programação, e sim a organização de responsabilidades dentro do código.
  • E - Apply Table Data Gateway Pattern: Este padrão é usado para encapsular o acesso a dados em uma camada de abstração, mas não aborda diretamente a questão de separar a lógica de negócio da interface do usuário.

Em resumo, a melhor forma de resolver o problema apresentado é aplicando a técnica de "Separate Domain from Presentation", que está diretamente relacionada à separação de preocupações entre as regras de negócio e a interface de usuário, alinhando-se aos princípios de uma boa arquitetura de software e melhorando o sistema de forma considerável.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Tease Apart Inheritance quando você tem uma hierarquia de herança que realiza dois trabalhos ao mesmo tempo.

Convert Procedural Design to Objects quando você tem código escrito em estilo procedural.

Separate Domain from Presentation quando você tem classes de GUI que contém lógica do domínio.

Extract Hierarchy quando você tem uma classe que está fazendo muito trabalho, principalmente através de muitos comandos condicionais

Martin Fowler sugere com a técnica de PresentationDomainSeparation "[...] keeping a good separation between the presentation aspects of a program (the user interface) and the rest of the functionality. "

"[...] Presentation logic and domain logic are easier to understand when separate. [...]"

"[...] You can support multiple presentations on the same base program without duplicating code. [...]"

"[...] Despite these many advantages, I often see this principle violated. I think this is partly due to lack of knowledge, and partly due to the fact that many frameworks make it much too easy to intermix domain logic into the presentation, and make it harder to maintain the separation. [...]"

Fonte: https://martinfowler.com/bliki/PresentationDomainSeparation.html

 

 

 

 

Separate Domain from Presentation (Separar Domínio da Apresentação) é um princípio de design de software que defende a separação da lógica de negócios da interface do usuário. Isso significa que o código que modela o domínio da aplicação (as regras de negócio, as entidades, e as interações entre elas) deve ser mantido separado do código que lida com a apresentação da informação para o usuário (a interface gráfica, a camada web, etc.).

Vantagens de separar o domínio da apresentação:

  • Testabilidade: A lógica de negócio pode ser testada de forma independente da interface do usuário, o que facilita a criação de testes automatizados e aumenta a confiabilidade do código.
  • Manutenabilidade: O código é mais fácil de manter, pois as mudanças na lógica de negócio não afetam a interface do usuário e vice-versa.
  • Reusabilidade: A lógica de negócio pode ser reutilizada em diferentes interfaces de usuário, como aplicações web, desktop e mobile.
  • Acoplamento reduzido: As partes da aplicação são menos dependentes umas das outras, o que torna o código mais flexível e fácil de alterar.
  • Agilidade: Permite que desenvolvedores de diferentes áreas (frontend e backend) trabalhem de forma mais independente.

Como implementar a separação de domínio e apresentação:

  • Camadas: Divida a aplicação em camadas, com uma camada para a lógica de negócio e outra para a interface do usuário.
  • Padrões de design: Utilize padrões de projeto como Model-View-Controller (MVC) ou Model-View-Presenter (MVP) para estruturar a aplicação.
  • Frameworks: Utilize frameworks que facilitem a separação de domínio e apresentação, como Spring MVC, ASP.NET MVC, Angular, React, etc.

Exemplo:

Em uma aplicação de e-commerce, a lógica de negócio poderia modelar entidades como Cliente, Produto, Pedido e Carrinho de Compras, além das regras de negócio como cálculo de frete, validação de estoque e processamento de pagamentos. Já a interface do usuário seria responsável por apresentar as informações ao usuário, permitir a interação com a aplicação e coletar dados.

Em resumo:

A separação de domínio e apresentação é um princípio importante para a criação de aplicações robustas, testáveis, e manuteníveis. Aplicando esse princípio, você pode melhorar a qualidade do seu código e facilitar o seu desenvolvimento e manutenção a longo prazo.

Fonte: Bard

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo