2
respostas

[Sugestão] Alternativa anti-semântica pra um curso de boas práticas

Não veria nada demais se esse não fosse um curso de boas práticas, mas...

A alternativa B tem como exemplo o seguinte código:

interface Funcionario {
  // Definição da interface Funcionario
}

interface FuncionarioRepository {
  adicionarFuncionario(funcionario: Funcionario): void;
  removerFuncionario(id: number): void;
}

interface PagamentoService {
  processarPagamento(id: number, valor: number): void;
}

class FuncionarioRHService implements FuncionarioRepository {
  adicionarFuncionario(funcionario: Funcionario) {
    // Código para adicionar funcionário
  }

  removerFuncionario(id: number) {
    // Código para remover funcionário
  }
}

class PagamentoRHService implements PagamentoService {
  processarPagamento(id: number, valor: number) {
    // Código para processar pagamento
  }
}

O exemplo dá a entender que, ou FuncionarioRHService é um repository 'impostor' se passando por service, ou que ele é um service com lógica de negócio e de persistência acopladas, ou seja, com mais de uma responsabilidade, indo contra o S de SOLID, que é um dos temas do curso.

Services são services, repositories são repositories, a nomenclatura utilizada no exemplo é anti-semântica e torna o código confuso, pois parece ser uma coisa mas é outra.

2 respostas

Oii, Mateus.

Obrigada por sua sugestão, são sempre valiosas. Farei com que ela chegue nas pessoas responsáveis pela produção do curso.

Um abraço e bons estudos.

Olá Mateus! Tudo certo?

Muito pertinente o seu apontamento. De fato, a implementação da alternativa B não contempla de maneira correta uma boa prática, e a nomenclatura apresentada realmente causa confusão. Apreciamos muito sua observação e, graças a ela, iremos ajustar a alternativa para refletir melhor as boas práticas. Nesse caso pensamos em uma implementação mais condizente com as boas práticas e elas seria:

interface FuncionarioRepository {
  adicionarFuncionario(funcionario: Funcionario): void;
}

class FuncionarioDatabaseRepository implements FuncionarioRepository {
  adicionarFuncionario(funcionario: Funcionario) {
    // conexão com DB via model, passando DTO ou etc etc
  }
}

///////////

interface Funcionario {
  // Definição da interface Funcionario
}

import FuncionarioDatabaseRepository from "./etc/etc";

class FuncionarioRHService implements Funcionario {
  const funcionarioRepository = new FuncionarioDatabaseRepository();

  adicionarFuncionario(funcionario: Funcionario) {
    funcionarioRepository.adicionarFuncionario(funcionario);
  }
}

Com essas alterações, o código está mais alinhado com as boas práticas e os princípios SOLID. A nomenclatura fica mais clara , e a separação entre lógica de negócio e persistência está mais evidente. Agradeço novamente pelo seu apontamento e contribuição, é assim que podemos aprender e melhorar cada vez mais!