«

»

Apr 02

Print this Post

Implementando a Camada de Modelo – Model

Vamos à terceira parte do artigo de arquitetura para desenvolvimento em camadas.
Para quem não viu os artigos anteriores deem uma olhada nos links abaixo:

  • Implementando a camada DAO
  • Implementando uma arquitetura em camadas

Pode dar uma lida também nesse post de referência:

  • Uma visão sobre arquitetura de softwares.

Conforme falamos nos artigos anteriores, vamos mais uma vez apresentar de forma prática a implementação de uma metodologia de desenvolvimento de softwares em camada.
Estamos na camada de modelo, como expliquei antes, a camada Model é responsável por implementar regras de negócios do software que sejam ligadas diretamente ao banco de dados da aplicação. Ou seja, toda regra que vá influenciar diretamente o que vai chegar ou o que vai retornar do banco de dados, deverá passar pela camada de modelo.


Essa tarefa é dada ao modelo para evitar que regras sejam tratadas dentro da camada DAO, onde o acesso ao banco está exposto, com essa centralização na camada de modelo a requisição do usuário só chegará no banco de dados se passar pela camada de modelo, deixando os dados ainda mais filtrados para a camada de negócios propriamente dita.
Outra vantagem dessa centralização, é em caso de uma futura necessidade de implementação de um webservice para consumir um recurso do banco de dados da aplicação.
Digamos que você precisa de uma listagem de clientes, porém nas regras da sua aplicação, todos os clientes são consultados por filial, cada filial só pode receber dados de seus clientes.
Mas o webservice é para alimentar o sistema do novo setor de gestão de clientes da empresa toda e não de uma filial.

Seguindo a lógica da arquitetura em camadas e seguindo uma divisão de responsabilidades, a implementação poderia ser da seguinte forma.

Model.listarClientes() {
    var filialLogada = instance.login.getFilialLogada( userAutenticado );
    return instance.dao.listarClientes( filialLogada );
}

Ps. Não fiz nenhuma validação, simplesmente um exemplo básico.

E na camada DAO a única verificação é que se o filialLogada for a sede da empresa não faz filtro por filiais.
Dessa forma no DAO temos duas possibilidades somente, traz tudo ou só traz os clientes de uma filial e no Modelo só temos uma opção, só retorna os dados referente a filial logada.
Agora ao fazer uma chamada webservice, implementaríamos uma camada chamada Services e teríamos um método listarClientes() que passaria para o mesmo DAO o código da sede como filialLogada.
Não teria modificação nenhuma na aplicação, nem na camada de modelo e nem na camada DAO.
Bom, acho que deu para entender um pouco sobre a importância da camada de modelo e a importância de deixar certas regras nela e não no banco de dados.

Vamos a implementação dos códigos.
Primeiro vamos a implementação da classe base para os models.

<cfcomponent>
    <!---
    * Função: Construtor
    * @name init
    * @return void
    --->
    <cffunction name="init" access="package" returntype="void">
         <cfargument name="service" type="string" required="true" />
         <cfscript>
            this.instance     = Application.instance.Factory;
            this.dao    = this.instance.getDAO( arguments.service );
        </cfscript>
    </cffunction>
</cfcomponent>

Feita a ModelBase.cfc vamos implementar uma classe de modelo.

<cfcomponent displayname="Usuarios():Models" hint="Objeto Models de Usuarios" output="false" extends="ModelBase">
    <!---
    * Função: Construtor
    * @name init
    * @return void
    --->
    <cffunction name="init" access="public" output="false" returntype="Struct">
        <cfscript>
            super.init( service : "Usuarios" );
            return this;
        </cfscript>
    </cffunction>
    <!---
    * Função: lista os dados
    * @name listar
    * @return Query
    --->
    <cffunction name="listar" access="public" output="false" returntype="Query">
        <cfargument name="id" type="numeric" required="false" default="0" />
        <cfscript>
            return this.dao.listar( id : arguments.id );
        </cfscript>
    </cffunction>
    <!---
    * Função: salva os dados
    * @name salvar
    * @return void
    --->
    <cffunction name="salvar" access="public" output="false" returntype="void">
        <cfargument name="dto" type="dto.Usuarios" required="true" />
        <cfscript>
            if( IsInstanceOf( arguments.dto , "dto.Usuarios" ) == true ){
                this.dao.salvar( dto : arguments.dto );
            }
        </cfscript>
    </cffunction>
    <!---
    * Função: deleta os dados
    * @name delete
    * @return void
    --->
    <cffunction name="delete" access="public" output="false" returntype="void">
        <cfargument name="id" type="numeric" required="true" />
        <cfscript>
            this.dao.delete( id : arguments.id );
        </cfscript>
    </cffunction>
    <!---
    * Função: autenticar usuários
    * @name autenticar
    * @return query
    --->
    <cffunction name="autenticar" access="public" output="false" returntype="query">
        <cfargument name="usuario" type="dto.Usuarios" displayname="usuario" required="false" default="0" />
        <cfscript>
            return this.dao.autenticar( usuario : arguments.usuario );
        </cfscript>
    </cffunction>
    <!---
    * Função: ativar usuários
    * @name ativarUsuario
    * @return boolean
    --->
        <cffunction name="ativarUsuario" access="public" output="false" returntype="boolean">
        <cfargument name="usuario" type="dto.Usuarios" displayname="usuario" required="true" />
        <cfscript>
            return this.dao.ativarUsuario( usuario : arguments.usuario );
        </cfscript>
        </cffunction>
    <!---
    * Função: listar usuários
    * @name listarUsuarios
    * @return Query
    --->
        <cffunction name="listarUsuarios" access="public" output="false" returntype="query">
            <cfargument name="usuario" type="any" displayname="usuario" required="false" default="0" />
        <cfargument name="ativos" type="boolean" displayname="ativos" required="false" default="true" />
        <cfargument name="inativos" type="boolean" displayname="inativos" required="false" default="true" />
            <cfscript>
            return this.dao.listarUsuarios( usuario : arguments.usuario , ativos : arguments.ativos , inativos : arguments.inativos );
        </cfscript>
        </cffunction>
</cfcomponent>

Percebemos na implementação da classe de modelo acima, que não passa de uma ponte entre o Controller e o DAO, porém nessa ponte seguimos algumas regras básicas de validação e implementamos algumas lógicas que são de responsabilidade da mesma camada.

Como estamos estudando um modelo básico de implementação, não estou me apegando em detalhes de validação, regras de negócios, até porque, quero deixar essas preocupações com cada desenvolvedor.
Temos que lembrar da importância de termos métodos que só fazem o que são de suas responsabilidades e deveres, para que não percamos o controle do core de nossa aplicação.
Entendo que grande parte dos leitores dessa área desse blog, são desenvolvedores, ou já tem um nível de conhecimento que o torna capaz de ler um código e entender o que o mesmo faz. Por tanto não vamos perder tempo explicando B-A-BA, mas caso surja alguma dúvida, não exite em comentar, responderei com prazer.

Na próxima, vamos falar da camada de controle.
Grande abraço a todos, até a próxima.

Paulo Teixeira
Fonte: http://www.pauloteixeira.blog.br/site/index.php/content/2012/implementando-a-camada-de-modelo-model/

Permanent link to this article: https://ensina.me/coldfusion/implementando-a-camada-de-modelo-model/

Leave a Reply