Usando Design Patterns em classes de domínio
[Finalizado Pelo Aluno]
Opa, tudo bem Carlos?
Antes de tirar minha dúvida quero aproveitar pra dizer que os cursos de Laravel são de extrema qualidade, vão além do que esperava!
Pelo que entendo do Laravel, uma premissa sobre os Models (Eloquent), é que todos eles são persistidos já que implementam o Active Record,
ou seja, tem duas reponsabilidades: persistir os dados e encapsular as regras de negócio.
Em alguns casos nem sempre temos a necessidade de persistir os modelos, por exemplo:
Imagine o cenário onde tenho um diário de trade, e nele eu preciso me basear em uma projeção para calcular as metas mensais, semanais e diárias.
Cada uma dessas classes de período/intervalo sabem calcular o valor da meta baseado em seu tipo. Sei que estou sendo muito abstrato, vamos ao código:
Nese caso estou usando o padrão strategy
interface ProjectionCalculatorInterface
{
public function calculate(ProjectionInterface $projection): float;
}
// Uma das classes concretas que implementam o strategy
final class DailyCalculator implements ProjectionCalculatorInterface
{
public function calculate(ProjectionInterface $projection): float
{
// algoritimo para calculo de meta diária
}
}
// Projeção
final class Projection implements ProjectionInterface
{
public function calculate(ProjectionCalculatorInterface $strategy): float
{
return $strategy->calculate($this);
}
}
Perceba que essas classes apenas compõem parte da minha regra de negócio que preciso executar antes de persistir a meta em si,
mas não tenho a necessidade de armazena-las no banco, entende?
Também sei que estou indo meio que "contra" o framework, onde tenho uma pasta chamada Domain e nela tenho os objetos puros com suas regras de negócio e que posteriormente faço uso dela em um service layer e persisto usando um repository, na mesma pegada que você ensina nos cursos de Laravel, mas ao invés de
receber um Model, recebo uma interface desse objeto de domínio.
Nesse cenário, acho que estou indo longe demais? Quando comecei em PHP, não tinha idéia sobre S.O.L.I.D e Design Patterns, hoje com um pouco mais de experiência acredito que esse seja o caminho certo.
Forte abraço!
Olá, Rafael!
Tudo bem?
Desculpas a demora em te responder amigo.
Obrigado pelo feedback, gratidão!
-----------------
Entendi o seu caso.
Sinceramente pra mim você não está indo longe, está mandando super bem, está correto a forma que está implementando.
Está trabalhando com DDD?
Então professor, no meu entendimento sobre OOP, DDD é uma consequência, é claro que a arquiterura é mais complexa e ainda tenho alguns débitos técnicos, principalmente na parte de escalabilidade, como implementar micro serviços e toda essa parte de comunicação usando mensageria/filas.
Depois vou abrir um ticket e subo um gist para mostrar um exemplo de como uso o repository totalmente desacoplado do ORM, enfim outros assuntos :)
De qualquer forma, fico feliz em saber que estou no caminho certo, as vezes soa overengineering, mas é como entendo OOP.
Muito obrigado pela atenção. Forte abraço!
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!