Será um prazer ;) Model: http://rafb.net/p/lvUQZn85.html Controller: http://rafb.net/p/9xn4qn83.html View: http://rafb.net/p/BmjSN559.html
Tomara que eu não passe vergonha :D ----- Original Message ----- From: bsb infor To: [email protected] Sent: Wednesday, February 11, 2009 10:15 AM Subject: Re: [CodeIgniter] Exemplo MVC boas praticas (Eric Saboia) Olá Eric Saboia, estou acompanhando esta lista e achei muitissimo interessante seu model, gostaria de lhe pedir que postasse aqui as 3 camadas, desta forma acho que fica facil pra qualquer pessoa entender. Se eu estiver abusando favor desculpar. Abraço a todos. 2009/2/11 <[email protected]> Enviar submissões para a lista de discussão Lista para [email protected] Para se cadastrar ou descadastrar via WWW, visite o endereço http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br ou, via email, envie uma mensagem com a palavra 'help' no assunto ou corpo da mensagem para [email protected] Você poderá entrar em contato com a pessoa que gerencia a lista pelo endereço [email protected] Quando responder, por favor edite sua linha Assunto assim ela será mais específica que "Re: Contents of Lista digest..." Tópicos de Hoje: 1. Re: Exemplo MVC (boas práticas) (Eric Saboia (Fortes Informatica)) ---------- Mensagem encaminhada ---------- From: "Eric Saboia \(Fortes Informatica\)" <[email protected]> To: "CodeIgniter Brasil" <[email protected]> Date: Wed, 11 Feb 2009 09:07:36 -0300 Subject: Re: [CodeIgniter] Exemplo MVC (boas práticas) 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 ------------------------------------------------------------------------------ _______________________________________________ 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

