Vinicius,
5 camadas no DDD? até onde eu sabia eram 4, e que pra mim na verdade acabam 
sendo as 3 do MVC, ele só divide o Model em duas camadas, pra separar o que 
realmente pertence a um dominio e o que é utilizado (requerido e etc) por esse 
domínio.

O livro que indico sobre DDD é: Domain-Driven DESIGN por Eric Evans, que é o 
criador da "pattern".

Quanto a um Model pra cada tabela, isso não existe.. na verdade o que você tem 
pra cada tabela é um objeto persistente, a tal classe que tem atributos iguais 
as colunas de uma tabela (no caso o CI não implementa isso nativamente, você 
pode procurar algo sobre ORM se tiver interesse), mas um modelo pode conter 
vários métodos utilizando mais de uma tabela (desde que sejam do mesmo domínio)

Aproveitando o que acabei de falar e respondendo a outra dúvida, de como deve 
ser a lógica quando precisamos de um registro dentro do outro (Como recuperar a 
lista de usuários e seus emails), eu faço assim:




function listarEvento($data=false)
{
    // Percorre os meses
    $meses = $this->listarMes($data);

    foreach ($meses as $mesRow) {
        $retorno[$i]['mes'] = $mesesArray[$mesRow['mes']];
        // Percorre os eventos deste mes
        $eventos = $this->listarMesEvento($mesRow['mes'], date('Y'), $data);
        $retorno[$i]['eventos'] = $eventos;
    
        $i++;
    }

    return $retorno;
}

Tanto o método listarEvento, quanto o método listarMes, quanto o método 
listarMesEvento estão no mesmo modelo. Assim, no listarEvento monto um objeto 
contendo todos os meses e dentro de cada mês um objeto contendo todos os 
eventos deste mes.

Dentro do controller simplesmente chamo $this->modelo->listarEvento(); e já 
tenho tudo mastigado pra percorrer na view.


Ah, por favor fiquem a vontade pra criticar qualquer coisa que falei... estou 
aqui aprendendo sobre o assunto tanto quanto vocês! :D

  ----- Original Message ----- 
  From: Ricardo Valfreixo 
  To: CodeIgniter Brasil 
  Sent: Tuesday, February 10, 2009 9:29 PM
  Subject: Re: [CodeIgniter] Exemplo MVC (boas práticas)


  Ola a todos,

  metendo a minha colher.

  O Service Layer começou a ser usado essencialmente por causa dos interfaces. 
Assisti de muito perto uma evolução normal de MCV "tradicional" para uma 
arquitectura de 4 tiers. A verdade é que para equipas grandes se torna a forma 
mais simples de descentralizar trabalho. 

  Nesse projecto, tinha um génio das bases de dados que se encarregava de todos 
os models e optimização dos bancos de dados. Havia um javascript wizard que 
tratava de todos os interfaces. E dois developers que tratavam do service layer 
onde o grosso da acção se passava. Os controladores funcionavam como "policias 
de transito" que apenas redireccionava processamento e decidia qual o pedaço de 
software seguinte a ser chamado.

  Em especial porque havia alguns pedaços do sistema que eram sistemas REST e 
webservices. Para isto, o service layer é perfeito.

  Agora, muito sinceramente, para o site pequeno e "normal" os 3 tiers chegam e 
sobram.

  Mas isso são os meus dois tostões :)

  // Zen




  2009/2/10 Marcus Cavalcanti <[email protected]>

    E acho que por ultimo pode deixar esse aqui: 

    http://www.submarino.com.br/produto/9/373407?franq=102414







    2009/2/10 Marcus Cavalcanti <[email protected]>

      os livros são meios caros,mas vale.. 

      mas tem um site que tem pdf de livros, para quem curtir: 
http://www.flazx.com/



      2009/2/10 Marcus Cavalcanti <[email protected]>

        É isso, pensa que no controller não deve conhecer as regras da sua 
aplicação, ele apenas faz chamdas, controla fluxo, popula objetos, essas 
coisas, mas ele não deve conhecer regras .. 

        Livros: 

        http://www.submarino.com.br/produto/9/343713/domain-driven+design
        
http://www.submarino.com.br/produto/1/1348031/padroes+de+arquitetura+de+aplicacoes+corporativas
        
http://www.submarino.com.br/produto/1/242126/refatoracao:+aperfeicoando+o+projeto+de+codigo+existente



        2009/2/10 Vinicius Cruz <[email protected]>

          Fala, Marcus!


          Sobre DDD, tens algum livro ou apostila para indicar?


          O que me preocupou com tudo isso é justamente o que citastes. Estou 
vendo além, uma nova abordagem. E, cada mês que passa, o sistema da empresa tem 
crescido consideravelmente. E, do jeito que as coisas estão indo, a 
escalabilidade estava em baixa. Ou seja, daqui a um tempo, eu (ou outro louco 
que assumisse o comando) iria se ver doido pra deixar tudo em ordem.


          Dai a necessidade de eu entender melhor essa abordagem, analisar as 
entidades, e refatorar, na medida do possivel, o sistema nesse "novo conceito".


          A mosta tá virando um bicho, eu ainda estou com o mata-mosca em mãos. 
=D


          Em relação ao exemplo, minha dúvida é se o code deve estar no 
controller, ou no model, já que o mesmo é responsável pela regra de negócio. 
Estive lendo um pouco de ruby on rails, e eles tem por lema deixar o model 
gordo e o controller magro, não é isso?


          Vinicius


          2009/2/10 Marcus Cavalcanti <[email protected]>


            Fala Vinicus.. DDD é um pouco sobre do que estamos tentando falar, 
se aprofunde que vale a pena, cada vez que vc se aprofundar, mais vai perceber 
que sabia menos das coisas hehe isso é normal, por isso as vezes a ignorância 
uma dádiva, mas em outros casos não hehe

            Mas vamos lá, então, isso é uma questão bem conceitual mesmo... não 
é que o CI está errado, acho que ele apenas não dá um suporte NATIVO para 
aplicações mais complexas, mas nada que você possa extendê-lo, como eu faço por 
exemplo no caso do services, sacou? Na verdade ele implementa o MVC certo, pois 
ele separa as coisas, agora como as pessoas fazem o seu uso, aí é outra coisa.. 
uma coisa que eu acho  importante citar é que nesse caso não existe o certo e o 
errado e a verdade e a mentira, o que existe é uma preocupação para quando o 
buraco ficar mais embaixo.. se você faz da forma X e te atende muito bem, vc 
não tem problemas, consegue dar manutenção, extender e etc, ok ótimo, te 
atende, para que você vai mudar? Agora se você começar a perceber ao conhecer 
uma nova abordagem que o que você usava pode ser melhorado, é bom vc começar a 
pensar nisso, o que eu quero dizer é "Não tente matar uma mosca com um tiro do 
canhão".

            A gente tá falando de aplicações enterprise, ou seja, aplicações 
com um certo tamanho, onde é importante você deixar as coisas menos acopladas 
possíveis e mais coesas também. Por exemplo, ActiveRecord, se vc for parar pra 
pensar na essencia é um anti-pattern, mas em muitos casos ele dá uma agilidade 
e velocidade de desenvolvimento que fazer o seu uso é muito bom. Da mesma forma 
que as vezes você usar Activerecord em alguns casos não é bom, é melhor começar 
a pensar em soluções que implementem um ORM por exemplo.

            No seu caso de usuários x emails, você poderia pensar da seguinte 
forma:

            - É um usuário que conhece um email ou um email que conhece um 
usuário?
            - Um email precisa de alguém para ser enviado, esse alguém é um 
usuário?
            - Você precisa ter uma entidade para relação email_x_usuario? Eu 
sinceramente acredito que nao, pq o dominio da sua aplicacao fala de usuario e 
email e não de uma relação, nesse caso um "select * from email_x_usuario where 
id_usuario = ?" não resolveria o problema? e onde isso ficaria? acredito que no 
modelo de usuario, mas depende.

            Por isso que é importante vc analisar seu cenário, não tem uma 
receita de bolo feita, cada aplicação tem um contexto e particularidades o 
importante nesse caso é conhecer as alternativas para ver a que melhor te 
atende.

            Engenheria de software é algo ainda recentemente novo, comparo por 
exemplo a uma engenharia civil por exemplo, portanto ainda é algo que cabem 
muitas definições, opniões, conceitos, por isso que a parada é estudar mesmo :)


            2009/2/10 Newton Wagner <[email protected]>

              Adicionando um pouco de sal à dúvida, neste caso pode-se 
considerar

              que e-mail seria uma entidade fraca, ou seja, ela não existe sem o
              usuário. Mas e se for uma entidade forte? Vocês tratariam da mesma
              forma? :)


              2009/2/10 Vinicius Cruz <[email protected]>:

              > Roberto
              > faz sentido. Li uma vez no manual, se não me engano, dizendo 
que para cada
              > tabela deveria ter um model... oO
              > Não lembro exatamente onde foi, mas essa discussão está 
quebrando vários
              > paradigmas (pelo menos pra mim).
              >
              > Vinicius
              > 2009/2/10 Roberto A. Longhi <[email protected]>
              >>
              >> Salve Vinicius blz ?
              >>
              >> =]
              >> Bom to entrando de gaiato na história, mas tenho algumas 
duvidas referente
              >> a isso, e vou colocar algumas considerações.
              >>
              >> No caso que você ilustrou do usuário com vários emails, 
acredito que o
              >> ideal é deixar a consulta de emails no mesmo model, neste caso 
o model de
              >> usuário, para evitar carregar outros models.
              >>
              >> $queryUsuario = $this->Usuariomodel->getLista();
              >> foreach($queryUsuario->result() as $row)
              >> {
              >>     $idusuario = $row->idusuario;
              >>     $emails[$idusuario] = 
$this->Usuariomodel->getEmails($idusuario);
              >> }
              >> Estou levando para o lado que o model controla todas as 
informações
              >> relacionados a aquela entidade (no caso o usuário). Mesmo que 
ela seja
              >> armazenada em outra tabela (nesse caso uma tabela de 
emailXusuario.
              >>
              >> Faz sentido ?
              >>
              >> Vinicius Cruz escreveu:
              >>
              >> Ok, Marcus.
              >> Esses dias estava dando uma lida sobre DDD. Li algo sobre 
arquitetura de 5
              >> camadas, e estou tentando me aprofundar cada vez mais no 
assunto. Alias, to
              >> indo hoje fazer uma entrevista pra pós de engenharia de 
software. Vou meter
              >> as caras nos livros!! =D
              >> Agora, sempre surge novas duvidas. Por exemplo: uma vez foi 
postado na
              >> lista, sobre como recuperar a lista de alguma coisa de um 
usuário. Por
              >> exemplo: um usuário tem vários emails cadastrados, em uma 
tabela de
              >> relacionamento. Como recuperar a lista de usuários e seus 
emails?
              >> Como eu faço atualmente. No controller:
              >> $queryUsuario = $this->Usuariomodel->getLista();
              >> foreach($queryUsuario->result() as $row)
              >> {
              >>      $emails[$row->idusuario] =
              >> $this->Emailsmodel->consulta_emails($row->idusuario);
              >> }
              >> Mas entrei em profunda depressão em saber que o CI não aborda 
o MVC como
              >> conceituado (ou pelo menos dá margem ao erro). eheheheheh
              >> Mas a questão é: tá errado fazer assim? Qual seria uma outra 
abordagem?
              >> Vinicius
              >> 2009/2/10 Djalma Araújo | www.djalmaaraujo.com.br
              >> <[email protected]>
              >>>
              >>> Então, pode crer...
              >>> a idéia é apenas o usuário enviar a imagem dele no portfolio 
e atualizar
              >>> no banco.. essa atualizacao eu utilizo um funcao o model..
              >>>>
              >>>
              >>> _______________________________________________
              >>> Lista mailing list
              >>> [email protected]
              >>> 
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
              >>>
              >>
              >> ________________________________
              >> _______________________________________________
              >> Lista mailing list
              >> [email protected]
              >> 
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
              >>
              >>
              >> --
              >> Roberto Almeida Longhi
              >> Programador
              >> Contmatic
              >> (11) 2942 6700 Ramal 1404
              >> (11) 8599 9022
              >> www.contmatic.com.br
              >>
              >> _______________________________________________
              >> Lista mailing list
              >> [email protected]
              >> 
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
              >>
              >
              >
              > _______________________________________________
              > Lista mailing list
              > [email protected]
              > 
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
              >
              >




              --

              Newton Wagner

              skype: newtonwagner
              msn/gtalk: [email protected]

              http://www.newtonwagner.net/

              - http://www.owshit.com.br/


              _______________________________________________
              Lista mailing list
              [email protected]
              
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br





            -- 
            Marcus Cavalcanti
            21 9144-5068
            www.marcuscavalcanti.net/blog


            _______________________________________________
            Lista mailing list
            [email protected]
            http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br





          _______________________________________________
          Lista mailing list
          [email protected]
          http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br





        -- 
        Marcus Cavalcanti
        21 9144-5068
        www.marcuscavalcanti.net/blog




      -- 
      Marcus Cavalcanti
      21 9144-5068
      www.marcuscavalcanti.net/blog




    -- 
    Marcus Cavalcanti
    21 9144-5068
    www.marcuscavalcanti.net/blog


    _______________________________________________
    Lista mailing list
    [email protected]
    http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br






------------------------------------------------------------------------------


  _______________________________________________
  Lista mailing list
  [email protected]
  http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
_______________________________________________
Lista mailing list
[email protected]
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br

Responder a