phpNucleum 5 - Onde formatar?
Autor: Everton L. Berz [mutant] | Publicado: 2010-10-25T12:00:00-02:00

Onde formatar? 
Estamos usando o padrão MVC, mas onde é o melhor local para formatar um valor? No Model, no View, ou no Controller?

Model) Foi feita uma tentativa de formatar no Model, existem duas classes Model que deveriam receber a implementação: Modelo e Grid.
- Classe Modelo: os atributos desta classe seriam formatados automaticamente após rodar o método "encontrar" (que carrega os valores). Notou-se que se o valor de um atributo estivesse sempre formatado no Model, quando o Controller fosse utilizá-lo para efetuar cálculos (datas, monetários, etc) ele teria que "desformatar" o valor e depois formatar novamente. Sendo que o Controller fazer isso é algo bastante comum. Um outro problema registrado foi o fato de que nem sempre se deseja todos os atributos formatados, pois na página de consulta se necessita os valores de um jeito, mas na alteração de outro.
Uma solução para estes problemas foi criar um método que retornasse um array com os valores formatados, sendo que os valores dos atributos permaneciam originais.
- Classe Grid: a formatação via Model, para montantes de dados carregados em grid's, implicaria na construção de um método que percorreria todos os valores e formataria de acordo com o tipo de dado.

Problema de implementar formatação nesta camada: muitas vezes temos tipos de dados que tem uma 
formatação própria (independe do tipo no BD). Exemplo: campos monetários
 (no BD é numérico), CPF, CNPJ, telefone, etc. Nestes casos, se chegou a
 implementar um método para formatação personalizada de atributo na classe Modelo, porém para a classe Grid se viu dificuldade em se ter a formatação em montantes de dados grandes e, principalmente, a identificação de campos com formatação personalizada.

View) Nesta camada a formatação ocorre somente no momento de exibir os dados para o usuário. Ou seja, todas as formatações que se deseja fazer devem ser explicitamente declaradas. Esta já era a maneira utilizada para formatação no phpNucleum 4.x, um diferencial que&nbsp; foi implementado no phpNucleum 5 é a utilização pelo Smarty dos mesmos métodos de formatação usados no PHP. Exemplo:
CPF: {$valoresTeste.cpf|escape|formatarCpf}
Valor: {$valoresTeste.valor|escape|formatarMonetario}
Os modificadores 'formatarCpf' e 'formatarMonetario' são os próprios métodos Auxilio::formatarCpf e Auxilio::formatarMonetario. Desta forma o código de formatação não fica redundante (pelo menos entre o PHP e o Smarty).
Os locais que possuem funções de formatação são:
- PHP (phpNucleum\Auxilio)
- jnGrid (e suas dependências)
- jnCalendar (e suas dependências)
- iReport 
É fato que usando esta camada se perde a configuração única de localização, pois ao se desejar a alteração de uma configuração de formatação de data/valor, devem ser alteradas as configurações em todos os locais acima mencionados. Porém notou-se que usando a camada Model e Controller isto também aconteceria, pois a configuração de formatação do jnCalendar e do iReport seria necessária de qualquer maneira.

Controller)&nbsp;Não se percebeu muita diferença entre realizar a formatação nesta camada e na camada View. Porém o problema de formatar montantes grandes de dados se repetiria nesta camada (percorrer todos os registros e fazer formatação personalizada).


Conclusão
Todas as camadas tem seus prós e contras, as camadas Model e Controller têm problemas com desempenho, pois percorrer 18 mil registros para formatar valores de cpf, data, valores, etc é bastante custoso em termos de memória e processamento. Na camada View sofremos com a falta de um arquivo único de configuração, porém se percebeu que tal problema acontece também no Model e no Controller. Outra característica da View é que não existe formatação automática (tudo é explicitado). A característica de formatação automática pode ser visto como vantagem e também como desvantagem, ou seja, como tudo na informática, DEPENDE.
Em razão do exposto acima, levando-se em conta principalmente o fator desempenho, optou-se por utilizar a camada View na formatação dos dados.