Domain-Driven Design é uma metodologia de desenvolvimento de software que enfatiza a importância dos domínios para fornecer sistemas mais bem projetados e holísticos. O coração do Domain-Driven Design é a ideia de criar e trabalhar com \"modelos de domínio\". Um modelo de domínio é uma representação orientada a objetos de um domínio do mundo real. Um conceito chave no Domain-Driven Design é a ideia de um objeto de valor. Um objeto de valor é um objeto que representa um valor em vez de uma entidade ou uma coleção de entidades. Por exemplo, em um aplicativo de varejo, o objeto que representa a compra de um cliente pode ser um objeto de valor. Há vários benefícios de usar objetos de valor em seus modelos de domínio. Primeiro, os objetos de valor ajudam a simplificar seu modelo de domínio. Eles fornecem uma maneira mais compacta de representar dados e podem ajudar a reduzir a complexidade do seu código. Em segundo lugar, ao representar valores em vez de entidades ou coleções de entidades, os objetos de valor ajudam você a se concentrar nos aspectos importantes do seu domínio. Terceiro, os objetos de valor podem ajudá-lo a impor regras e invariantes de negócios. Por fim, os objetos de valor podem ajudar você a otimizar o desempenho e manutenção do seu sistema. Há algumas coisas a serem lembradas ao trabalhar com objetos de valor.
Primeiro, você precisa ter certeza de que seus objetos de valor são imutáveis. Isso ajuda a garantir que sejam thread-safe e que seu estado seja sempre consistente.
Em segundo lugar, você precisa ter certeza de que seus objetos de valor são serializáveis. Isso permite que eles sejam transmitidos entre diferentes partes do seu sistema sem problemas.
Tipos primitivos são a base da maioria das linguagens de programação. No entanto, os tipos personalizados podem fornecer mais funcionalidade e ser mais expressivos. Em PHP, o tipo primitivo string pode ser usado para representar um CPF, no entanto pode ser substituído pelo Value object "CpfValueObject". O objeto de valor CpfValueObject pode incluir recursos que não estão disponíveis com o tipo string. Por exemplo, o tipo CpfValueObject pode incluir um método para retornar o valor absoluto do cpf com ou sem os caracteres especiais dependendo da regra de negócio que seu domínio requer. Outra vantagem de usar objetos de valor é que ele pode tornar o código mais legível. Por exemplo abaixo um objeto de valor
cpf de um domínio User/
<?php
namespace App\Users\ValueObjects;
use Stringable;
class Cpf implements Stringable
{
private string $cpf;
public function __construct(string $cpf)
{
$this->setNumber($cpf);
}
private function setNumber(string $cpf): void
{
$opcoes = [
'options' => [
'regexp' => '/\d{3}\.\d{3}\.d{3}\-\d{2}/'
]
];
if(filter_var($cpf, FILTER_VALIDATE_REGEXP, $opcoes) === false) {
throw new \InvalidArgumentException('CPF inválido');
}
$this->cpf = $cpf;
}
public function __toString(): string
{
return $this->cpf;
}
}
Top comments (2)
Parabéns Matheus!!!
complementando seu artigo, a principal diferença entre um VO e uma Entidade do domínio é que os VOs não possuem um identificador (ID) enquanto as Entidades possuem.
são outros exemplos de ValueObjects:
Telefone:
DddCode
PhoneNumber
PhoneType
CountryCode
Cartão de Crédito
CreditCardNumber
ExpirationDate
IssueDate
Documento:
DocType
DocNumber
DocIssueDate
DocExpirationDate
Name:
FirstName
MiddleName
LastName
Hello and welcome to Dev.to Community ! 👋🏼😉
You can say hi to the Welcome Thread, introduce yourself and talk what you're learning !