A partir de hoje vou iniciar uma nova série falando apenas da camada de Modelo, que foi muito pedida pra mim, e vejo que é uma grande icógnita. Acredito que o MVC (Model, View, Controller) é o conceito de desenvolvimento mais conhecido, difundido, defendido e utilizado por programadores de todas as linguagens de programação.
Modelo é um conceito muito utilizado em programação, porém, muitas vezes, com diversos significados diferentes. Eu considero modelo como sendo a abstração de um domínio. Eu explico: Domínio é a área (ou ramo) de conhecimento de um sistema, como por exemplo, área financeira, escolar, industrial, e Modelo é o sub-conjunto de informações e operações do domínio que será utilizada na aplicação, e isso depende muito do tipo de aplicação que se deseja implementar.
Por exemplo, um sistema de controle de alunos, pertence ao domínio escolar, e o modelo é composto pelas caracteristicas de cada aluno (nome, telefone, endereço), pais, turmas, matérias, professores, entre outros. Agora imagine um sistema que apenas utiliza métodos de inteligência artificial para realizar a distribuição de horários entre os professores. Ele também pertence ao domínio escolar, porém o modelo dele é composto apenas pelas matérias, turmas e seus respectivos professores, pois não é necessário o nome de cada aluno para essa aplicação. Ou seja, o domínio é o mesmo, porém o modelo é mais reduzido.
Outra particularidade que se deve observar é que, por mais que os dois sistemas contenham informações sobre professores, matérias e turmas, os casos de uso que cada sistema realiza encima dessas informações também são diferentes, por isso é correto afirmar que o modelo abrange, além da abstração de dados do domínio que a aplicação irá manipular, também as operações (casos de uso) que a aplicação é capaz de fazer. Sendo assim, a camada Model do MVC deve ser responsável por todos os dados e comportamentos que pertencem ao modelo da aplicação.
Acontece que em muitos tutoriais que existem circulando pela internet, eu vejo que a camada de Modelo é representada como sendo apenas uma forma de abstrair o banco de dados para recuperar as informações, e isso acontece inclusive em sites de referência, como por exemplo a documentação do CodeIgniter. Veja:
class Blogmodel extends CI_Model { var $title = ''; var $content = ''; var $date = ''; function __construct() { // Call the Model constructor parent::__construct(); } function get_last_ten_entries() { $query = $this->db->get('entries', 10); return $query->result(); } function insert_entry() { $this->title = $_POST['title']; // please read the below note $this->content = $_POST['content']; $this->date = time(); $this->db->insert('entries', $this); } function update_entry() { $this->title = $_POST['title']; $this->content = $_POST['content']; $this->date = time(); $this->db->update('entries', $this, array('id' => $_POST['id'])); } }
Essa abordagem, apesar de facilitar o desenvolvimento, nos força a colocar as regras de negócio, dentro do controller, misturando assim as camadas M (Model) e C (Controller). Na próxima parte vou abordar a construção e organização de entidades, evitando assim essa mistura indesejada;
Vocês concordam? não concordam? Coloquem suas opiniões nos comentários!!
Ps. Eu não sou contra o CodeIgniter, pelo contrário, gosto muito do Framework, porém é necessário alguns “hacks”, que eu vou mostrar no próximo post.
Olá Everton,
concordo com você.
O Pessoal do codeigniter deve ter usado esse exemplo para facilitar o entendimento de quem procura por informações nas documentações do codeigniter.
Realmente a forma como algumas documentações e tutorial disponíveis explicam o M do MVC da uma idéia de que o Model serve só para abstrair o modelo de dados.
Vou esperar proximo post e ver como você propôe a criação de entidades sem misturar com classes especificas do framework.
Parabéns pelo artigo, como sempre muito bom.
Abração.
Eaí Everton, blz?
No segundo parágrafo você diz “Eu considero modelo como sendo a abstração de um domínio.”, mas sequencia fala “e Modelo é o sub-conjunto de informações e operações do domínio”. Então acho que no primeiro trecho você quis dizer “Eu considero modelo como sendo a abstração de um SUB-domínio.”. Isso? =-)
Muito bom o artigo. Assim como o Fausto, também estou esperando pelo próprio para ver a sequencia do seu raciocínio.
Abraço
Não Lucas, o modelo é uma abstração do domínio. Uma abstração não é nada mais nada menos que um sub-conjunto de informações e operações do modelo.
O Sub-conjunto de informações abaixo podem ser consideradas um abstração de um carro, que no caso é o nosso modelo:
quatro rodas, quatro portas, 2008, bancos em couro, cor vermelha. Anda pra frente e pra trás, da a partida, acomoda 5 pessoas.