DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

SoC (Separation of Concerns)

Introdução

Esse principio tem relação de certa forma com o princípio SOLID. Esse é um princípio simples: Cada módulo, classe ou função deve ter uma única responsabilidade.

A violação desse princípio causa código duplicado com mais de uma responsabilidade, que consequentemente viola outros princípios, com SRP e DRY (Don’t Repeat Yourself)

Exemplos da aplicação do conceito

  • Separar interface (frontend) da lógica de negócios (back-end)
  • Separar o código de acesso a dados do código da apresentação dos dados
  • Separar o projeto em diferentes módulos/camadas com responsabilidades distintas
  • Criar componentes/classses/funções que realizam apenas uma única tarefa com eficiência

Acomplamento e Coesão

A aplicação da separação dos conceitos/responsabilidades envolve dois processos

  1. Reduzir o acoplamento
  2. Aumentar a coesão

Acomplamento

É o nível de dependência/conhecimento entre os componentes do sistema. Quanto maior o acoplamento entre os componentes do sistema, maior será a dependência entre eles e mais difícel será realizar manutenção, reusar e estender o sistema

Coesão

Nível de integridade interna dos componentes do sistema. Quanto maior for a coesão entre os componentes mais definidas são suas responsabilidades, sendo mais difícil desmembrar o componente em outros componentes

Exemplo prático

A seguir vamos desenvolver uma classe de usuário, onde o objetivo será:

  1. Validar os dados
  2. Salvar no Banco
  3. Enviar email de boas vindas

Sem SoC

Aqui validação, persistência e envio de email estão misturados, o que viola o SoC

public class UserController {
    public void CreateUser(User user) {
        // valida dados do usuário
        // salva no banco
        // envia email de boas-vindas
    }
}
Enter fullscreen mode Exit fullscreen mode

Com SoC

Cada classe tem uma preocupação: validação, armazenamento, envio de email

public class UserValidator {
    public bool Validate(User user) { ... }
}

public class UserRepository {
    public void Save(User user) { ... }
}

public class EmailService {
    public void SendWelcomeEmail(User user) { ... }
}

public class UserController {
    private UserValidator validator;
    private UserRepository repository;
    private EmailService emailService;

    public void CreateUser(User user) {
        if (validator.Validate(user)) {
            repository.Save(user);
            emailService.SendWelcomeEmail(user);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Aplicação em arquiteturas

Em Clean Architecture por exemplo, SoC aparece na separação entre:

  • Domain: regra de negócio puras
  • Application/Service Layer: orquestra a regra de negócio
  • Infrastructure: persistência, envio de email e APIs externas
  • UI/Presentation: interface do usuário

Top comments (0)