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
- Reduzir o acoplamento
- 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á:
- Validar os dados
- Salvar no Banco
- 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
}
}
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);
}
}
}
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)