[php-architect] Dúvida de conceito utilizando DDD

27 views
Skip to first unread message

Felipe Moura

unread,
Jan 14, 2014, 3:11:34 PM1/14/14
to php-ar...@googlegroups.com
Fala pessoal,

Estou com uma duvida conceitual que parecer ser boba, mas gostaria de saber a opinião dos colegas.

Tenho um processo e andamentos do processo, quando cadastro um processo ele já deve ter o primeiro andamento e assim por diante. Sendo assim levanto as seguintes dúvidas: 

Injeto o repositório de andamento no serviço de processo?
O repositório de processo fica responsável em conter o mapper do andamento?
Injeto o serviço de andamento no serviço de processo?

Qual seria a melhor prática?  Nenhuma? Quais seriam outras possibilidades?

--

Atenciosamente,

Felipe Moura

Desenvolvedor Web
http://about.me/felipewebdf 
twitter: @felipewebdf
talk: felip...@gmail.com
msn: gu...@hotmail.com

(61) 8490-8156

ivo nascimento

unread,
Jan 14, 2014, 3:29:43 PM1/14/14
to php-ar...@googlegroups.com
A camada de serviço tem várias finalidades, ela pode ser de infraestrutura, de negócios, e bla bla bla...
Se o Serviço de "Processo" é do tipo de negócios, ou seja, implementa as regras de negócio, e faz parte da regra criar o primeiro "andamento do processo", ele deve ser feito no mesmo ponto, logo, no serviço de Processo.
Isso não implica diretamente em obrigatóriamente injetar o repositório de andamento nele, mas talvez consumir o serviço de "andamento" nesse ponto e criar o primeiro andamento no mesmo instante.



--
Você está recebendo esta mensagem porque se inscreveu no grupo "PHP Architect" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para php-architec...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Ivo Nascimento - Iann
-------------------------------------------------
   http://about.me/ivonascimento 
-------------------------------------------------

Maykonn Welington Candido

unread,
Jan 14, 2014, 3:54:05 PM1/14/14
to php-ar...@googlegroups.com
Realmente acho melhor consumir um serviço do que injetar um repositório. Tenho uma impressão de que injetar um repositório gera, de certa forma, um acoplamento maior do que consumir um serviço. Mas depende da sua implementação das duas formas.

Atenciosamente,

Maykonn Welington Candido

Jonathan Maciel

unread,
Jan 14, 2014, 8:54:09 PM1/14/14
to php-ar...@googlegroups.com
Boa noite,

Felipe, não é uma dúvida boba, implementar DDD mesmo nos dias de hoje não é comum e quanto mais "corporativo" mais ingressado é o "eco-sistema" de TI. Analisando o problema eu implementaria da seguinte forma...

Entidade: Processo e Andamento.
Repositórios: Processos e Andamentos.
Serviço: Processador.

Um serviço para "processar" os processos (entidade), um método para criar novos processos e armazena-los no repositório...
O serviço (enquanto domínio nunca é infra) em si é um artefato negocial a implementação sim é variável conforme a infra, exemplo, você pode ter a implementação de um serviço de processos que atende com xxx protocolos  ou simplesmente uma subclasse de uma representação de um serviço de um framework qualquer mas que represente/implemente o "contrato" de domínio/negócio (serviços de processos, por exemplo) ... e não há acoplamento nenhum em ter o repositório no serviço, ambos são artefatos do domínio, o acoplamento existiria em misturar a infra (implementações diversas com a lógica da aplicação), segue em anexo um esboço, simplório, porém mais esclarecedor que o abaixo.

/**

 * Serviço de Processos, Processamento de Processos, etc ...

 */

class ProcessadorImpl implements Processador {


    ...

    ...


    public function processarNovo()

    {

        $primeiroProcesso = new Processo();

        $primeiroProcesso->associarAndamento(new Andamento());

        $this->processos->atualizar($primeiroProcesso);

    }

}



Em 14 de janeiro de 2014 18:11, Felipe Moura <felip...@gmail.com> escreveu:

--
impl.png

Felipe Moura

unread,
Jan 15, 2014, 6:43:11 AM1/15/14
to php-ar...@googlegroups.com
Bom dia pessoal,

Gostei bastante das opiniões dos colegas, acrescentaram muito. Obrigado!

Tenho algumas considerações:

1) Acho que esqueci de mencionar que se trata da Service Layer. Tive a sensação que gerou um ruido.

2) De acordo com alguns estudos, tenho visto que o repositório no ServiceLayer seria um baixo acoplamento, digamos necessário, assim como o colega @jonathan citou, principalmente porque estou injetando ele no serviço e ele pertence ao negócio. A questão seria, posso ter mais de um repositório no serviço? faz sentido?

3) O repositório não é responsável por montar a entidade? Neste caso essa regra de andamento não deveria ficar no repositório do serviço?

4) A entidade Processo não seria composta pela entidade Andamento? No caso de trabalhar com os dois serviços ProcessoService e AndamentoService, como citado pelos colegas, como ficaria a entidade?

Desculpe o email grande, é que tenho esbarrado nesses por menores, tomo algumas decisões e sempre tenho a sensação que poderia melhorar.. rs 





Maykonn Welington Candido

unread,
Jan 15, 2014, 7:40:04 AM1/15/14
to php-ar...@googlegroups.com
Bom dia,

É como eu disse, o nível do acoplamento depende da implementação. Um certo nível de acoplamento sempre é necessário. 
@Jonathan, excelente exemplo.

Só pra tirar uma dúvida, a injeção do repositório foi através do construtor do serviço, certo? Fiquei com a mesma dúvida do Felipe sobre o uso de mais de um repositório pelo serviço.

Seria errado injetar o novo Processo no método processarNovo? Ex:

public function processarNovo(Processo $processo) {
     $primeiroProcesso->associarAndamento(new Andamento());
     $this->processos->atualizar($processo);
}

Atenciosamente,

Maykonn Welington Candido


Luís Otávio

unread,
Jan 15, 2014, 8:51:28 AM1/15/14
to php-ar...@googlegroups.com
Felipe,

Um detalhe que é importante você considerar é justamente a nomenclatura dos teus serviços.
"ProcessoService" e "AndamentoService" são nomes que não dizem absolutamente nada (e ainda tem mistura idioma).

Quando você modelar as coisas você deve modelar elas pensando no seu domínio.
Como você vai conversar com os outros envolvidos no projeto (não devs) sobre esse serviço?

Eu gosto de trabalhar com serviços de domínios bem especializados e com nomes que dizem aquilo que fazem (normalmente em inglês).
Vamos pegar o seu caso "Tenho um processo e andamentos do processo, quando cadastro um processo ele já deve ter o primeiro andamento e assim por diante"

Estamos claramente falando da criação de novos processos, e SEMPRE que criar um novo processo ele deve conter um andamento (o "assim por diante" eu vou omitir, pq também não diz nada :p).
O serviço poderia ser chamado de serviço de registro de processos, com um método para realizar este trabalho.

Assim temos que pensar quais são as entradas deste método, ou seja o que é necessário para inicializar um novo processo. Eu não faço a mínima ideia, portanto vou colocar apenas o responsável pelo processo.
Na "conversa" sobre o domínio ficaria algo como: nós enviamos o responsável (ou outros dados) ao serviço de registro de processos que criará um novo processo e realizará a persistência dos dados.

Acho que pessoas da equipe (não desenvolvedores) conseguirão entender de boa.
A implementação seria algo como:

interface ProcessRegistrationService
{
    /**
     * Registers a new process
     *
     * @param User $responsible
     *
     * @return Process
     */
    public function registerProcess(User $responsible);
}

interface ProcessFactory
{
    /**
     * Registers a new process // Como a criação do processo não é algo trivial (envolve processo e andamento), é legal que a gente separe esta tarefa do serviço em uma factory (que é um conceito do DDD que não foi mencionado ainda)
     *
     * @param User $responsible
     *
     * @return Process
     */
    public function create(User $responsible);
}

interface ProcessRepository
{
    /**
     * Persists the process
     *
     * @param Process $process
     */
    public function persist(Process $process);
}

Quanto à injeção de mais de um repositório dentro de um serviço, apenas devemos considerar que o serviço de receber todas as dependências necessárias para realizar suas operações, ou seja no problem at all :D


2014/1/15 Felipe Moura <felip...@gmail.com>

Maykonn Welington Candido

unread,
Jan 15, 2014, 9:27:49 AM1/15/14
to php-ar...@googlegroups.com
No momento de chamar o salvar do repositório, o ProcessFactory não poderia ser executado, ao verificar que é um novo processo e assim criar o novo processo e persisti-lo? Sinto cheiro de que isso não é algo bom, não sei dizer o porque hehe. Aparentemente está no que eu mesmo disse, estaria dando duas responsabilidades para o método salvar, criar o processo e persistir processo. Certo?

Atenciosamente,

Maykonn Welington Candido


Luís Otávio

unread,
Jan 15, 2014, 10:24:10 AM1/15/14
to php-ar...@googlegroups.com
Não, o serviço que coloquei apenas CRIA o processo


2014/1/15 Maykonn Welington Candido <may...@outlook.com>
Reply all
Reply to author
Forward
0 new messages