Escolar Documentos
Profissional Documentos
Cultura Documentos
28
mai
Agile
Artigos
Exemplos
Ferramentas
Programao
Sobre o Autor
Pesquisar
Sobre o autor
Nada melhor do que desenvolver um sistema utilizando uma boa
arquitetura de software, no ? Uma das arquiteturas mais utilizadas por
empresas e desenvolvedores de software o MVC (Model-View-Controller),
padro que fornece organizao, padronizao e facilidade de manuteno
do cdigo. Esse artigo aborda os passos bsicos para a elaborao de um
projeto arquitetado em MVC no Delphi. Confira!
O objetivo principal deste artigo mostrar a hierarquia de pastas em um projeto, a alocao das
units dentro dessas pastas e a forma como elas se comunicam entre as camadas. Portanto, vou
considerar que voc j tem conhecimento dessa arquitetura, noes bsicas de Orientao a
Objetos e experincia com Delphi, ok? Mesmo assim, se voc quiser conhecer os conceitos do MVC,
leia tambm este artigo.
Vamos l! O primeiro passo criar a pasta raiz do projeto, como C:\Aplicativo, por exemplo. Em
seguida, criaremos tambm mais trs pastas dentro dela: Model, View e Controller. Essa ser a
estrutura de subpastas que armazenar nossas units referentes a cada camada. A partir de ento,
as units criadas devero ser salvas de acordo com a sua responsabilidade no projeto:
As units das classes de modelagem devero ser salvas dentro da subpasta Model
J as units de controle devero ser salvas dentro da subpasta Controller
Por fim, os formulrios devero ser salvos dentro da subpasta View
O arquivo de projeto (DPR ou DPROJ) dever ser salvo fora dessas subpastas, ou seja, no
diretrio raiz da aplicao
Demais arquivos (imagens, arquivos texto, arquivos INI) opcionalmente podem ser salvos
em um diretrio prprio, como Arquivos
Categorias
Agile
Ambiente Profissional
Artigos
Clean Code
Delphi
Desenvolvimento
Dicas
Discusses
Engenharia
Internet
Mercado
Off-Topic
Pesquisas
Programao
Tecnologia da Informao
Alguns desenvolvedores preferem utilizar nomenclaturas em ingls nas units, nomeando-as como
classCliente e controllerCliente. Na verdade, o padro de nomenclatura relativo de cada
desenvolvedor, mas o importante definir um nome que seja condizente com a camada na qual a
unit est alocada.
Blogroll
Histrico de artigos
SubRotina no Facebook
Twitter!
Tweets
Follow
Profissionais TI
@profissionaisti
A comunicao entre as camadas realizada por meio da instanciao de objetos das classes.
Considerando que temos um domnio de negcio no projeto chamado Cliente, poderamos
escrever o bloco de cdigo abaixo para salvar um novo cliente no banco de dados:
30 Dec
22 Dec
#SubRotina Compilao de
Tweet to @acelestino86
var
//variveisdascamadasutilizadasnarotina
objetoCliente:TCliente;
Gesto Verde
objetoControle:TControleCliente;
begin
//instanciaodosobjetos
objetoCliente:=TCliente.Create;//classeModelo
objetoControle:=TControleCliente.Create;//classeControle
try
//preenchimentodosdados
objetoCliente.Codigo:=StrToIntDef(edtCodigo.Text,0);
objetoCliente.Nome:=Trim(edtNome.Text);
objetoCliente.CPF:=edtCPF.Text;
Pague-me um caf!
//chamadadarotinaparagravao
objetoControle.Salvar(objetoCliente);
finally
//liberaodosobjetosdamemria
FreeAndNil(objetoCliente);
FreeAndNil(objetoControle);
end;
end;
Atente-se que, ao chamar o mtodo Salvar de objControle, os dados do objetoCliente ainda no
sero efetivamente gravados no banco de dados. Antes disso, eles passam pela camada Controller,
responsvel por validar os dados do objeto para evitar que eles sejam transferidos para a camada
de acesso a dados (Model) com inconsistncias.
Observe que no exemplo acima, um dos atributos da classe Cliente o CPF. Podemos escrever
uma funo na camada Controller para validar o CPF e, em caso de invlido, abortar a operao de
gravao e retornar uma mensagem ao usurio. Essa uma grande vantagem da arquitetura MVC:
durante essa operao de validao no h nenhum acesso camada de acesso a dados. Na
prtica, como se a camada de acesso a dados (Model) ainda no soubesse que o usurio est
incluindo um novo cliente. Ela s ir receber o objeto quando estiver validado e consistente.
Interessante, no ?
A camada Controle, por sua vez, ter o seguinte cdigo no mtodo Salvar:
procedureTControleCliente.Salvar(constobjetoCliente:TCliente);
begin
//aquidevemserescritasasfunesdevalidao
objetoCliente.Salvar(objetoCliente);
end;
mtodos de acesso a dados (Salvar, Alterar, Excluir, etc) em units diferentes. Lgico, neste caso,
necessrio criar mais uma subpasta no diretrio da aplicao chamada DAO. A introduo dessa
camada tambm ir interferir na camada Controller. Por exemplo, utilizando o cdigo anterior
como comparao, a chamada do mtodo Salvar alterada para a seguinte forma:
procedureTControleCliente.Salvar(constobjetoCliente:TCliente);
var
objetoDAO:TDAOCliente;
begin
objetoDAO:=TDAOCliente.Create;
try
//aquidevemserescritasasfunesdevalidao
objetoDAO.Salvar(objetoCliente);
finally
FreeAndNil(objetoDAO);
end;
end;
procedureSetNome(Valor:string);
functionGetNome:string;
public
propertyNome:stringreadGetNomewriteSetNome;
end;
Legal, no ?
O exemplo contido neste artigo (com alguns incrementos) pode ser baixado neste link.
Pessoal, eu vou ficando por aqui e agradeo a vocs pela visita no SubRotina!
Qualquer dvida ou dificuldade no desenvolvimento de um projeto em MVC, entre em contato!
Abraos!
Artigos relacionados
no MVC, voc pode criar uma funo que retorne um OleVariant para
um ClientDataSet criado na memria (em tempo de execuo), e exibir
os dados na DBGrid.
Isso ajudaria um monte de gente, como eu, que anda perdida ao entrar
nesse mundo POO do Delphi
Por causa dos dbgrids, estou usando dois datasets em cada
datamodule: um dataset/datasource para o dbgrid e outro para os
objetos da OOP.
O form funciona, mas ainda est confuso de fazer manuteno depois
No sei se o fato da empresa ainda usar Delphi 7 tambm seja mais um
complicador ao migrar para POO tudo que antes estava em dataware.
Antes de abandonar o Delphi 7, tenho que jogar fora vrios
componentes de terceiro que no existem mais para as novas verses
do Delphi.
Obrigado novamente pela ajuda e pacincia.
Roberto Carlos comentou em 24/09/2013 s 13:31
A coisa fica ainda pior quando me pedem um dbgrid editvel
Andr Luis Celestino comentou em 24/09/2013 s 18:15
Ol, Roberto! Na verdade, a verso 7 do Delphi no dificulta o trabalho
com POO, ao menos que voc tenha que utilizar tecnologias exclusivas
das verses mais recentes. Roberto, em breve vou lhe enviar um
exemplo sobre como carregar um TClientDataSet com dados OleVariant.
bem simples! Obrigado novamente pelo comentrio!
Anderson comentou em 18/11/2013 s 11:59
Ol Andr, gostei do seu post mas observei que voce faz a validao dos
dados (regra de negocio) no proprio controlador nao seria uma boa
pratica criar um camada de negocio pra fazer a validaes dentro do
controlador e usa-lo apenas para direcionar as requisies?
Andr Luis Celestino comentou em 19/11/2013 s 21:54
Boa observao, Anderson! Essa questo gera muita controvrsia. No
exemplo que desenvolvi, decidi colocar as regras de negcio no
Controller, manter o Model exclusivamente para as classes de
modelagem e a camada DAO para persistncia com o objetivo de
demonstrar a separao de responsabilidades. Porm, muitos
desenvolvedores empregam uma estrutura mais gerenciada: o Model
agrega tanto as classes de modelagem quanto as regras de negcio,
enquanto o Controller somente faz o papel de interface entre a View e o
Model.
Na empresa em que trabalho, optamos por utilizar o MVP (Model-ViewPresenter) nessa estrutura que voc mencionou, e bastante funcional.
Toda a regra de negcio concentrada na camada Model, dispensando
o Presenter dessa responsabilidade. Os resultados at o momento foram
positivos.
Obrigado pelo comentrio!
getulio torres comentou em 27/11/2013 s 14:34
Ola caro Andr, muito bom seu arquivo, espero outros posts, voc
deveria tambm esta postando sobre banco de dados interbase sera de
grande proveito para muitosgrande abrao.
Roberto Carlos comentou em 27/11/2013 s 15:38
Voc poderia fazer um artigo demonstrando o MVP (Model-ViewPresenter)?
Tem muita diferena entre MVC, MVP, MVvM (Model-View-view-Model) e
MGM (Model-GUI-Mediator)?
Roberto Carlos comentou em 27/11/2013 s 15:41
Quais as principais vantagens e desvantagens entre programar com
DAO (Data Access Object) e ORM (Object Relational Mapping)?
Andr Luis Celestino comentou em 27/11/2013 s 16:43
Ol, Getulio! Nos exemplos de blog eu uso bastante o Firebird, que
basicamente uma verso Free do Interbase. Portanto, os exemplos
podem ser replicados no Interbase sem problema algum.
Abrao!
Andr Luis Celestino comentou em 27/11/2013 s 16:52
Ol, Roberto! Sim, h algumas diferenas entre esses padres de
Bom dia.
Preciso de uma ajuda com MVC.
Veja se pode ajudar.
Criei uma Interface cliente.
Contendo todos os campos da tabela cliente.
por exemplo
iCliente
snome
srua
sbairro
slocalidade
snumero
etc
Fao o sql e jogos todos os dados para
um
Tlist(icliente)
At aqui tudo ok.
funcionando sem problema.
a Minha duvida a seguinte
Qd vou montar me grid.
tenho todos os campos no Tlist(iclient).
S que nao quero mostar todos no grid.
S que tambem nao quero que seja fixo.
Gostaria de fazer alguma coisa assim como fao hoje usando a query.
for i:=0 to query.fields.count
meugrid.coluna := query.fieldbyname(campo).assgtring;
ou seja so os campos que trago na query e que mostro no grid.
asuando a interface trago todos os campos do banco e jogo na
interface..
ai teria que ficar fazendo um if ou deixar fixo.. nao consegui pensar em
algum para ser dinamico isso.
pode ajudar.
obrigado.
Andr Luis Celestino comentou em 06/08/2014 s 19:13
Ol, Paulo. Infelizmente no consegui compreender muito bem a sua
dvida. Vou entrar em contato para solicitar mais detalhes, ok?
Abrao!
Alexandre comentou em 18/09/2014 s 23:05
Ol, Andr parabns sem sombra de dvidas excelente seu post e
principalmente o funcionamento do seu demo, estava tentando aplicar
esse conceito nos meus desenvolvimentos porm sem sucesso. Seu
post caiu como uma luva para meu aprendizado. Gostaria se fosse
possvel que me enviasse mais detalhes da camada de persistncia
referente ao DAO que voc mencionou, pois minha dvida igual ao do
Jonathan/Genilson. Muito obrigado pela sua publicao est me
ajudando e muito. Abraos.
Andr Luis Celestino comentou em 19/09/2014 s 21:06
Ol, Alexandre! Muito obrigado pela visita e pelo comentrio!
O MVC, por no disponibilizar uma camada exclusiva para a persistncia
de dados, acaba gerando algumas incertezas mesmo. Porm, nada
impede que o desenvolvedor estenda a camada Model e crie uma
camada de persistncia, no caso, a DAO. Vou lhe enviar um e-mail com
mais explicaes, ok?
Abrao!
Alexandre comentou em 20/09/2014 s 00:27
Eu que tenho que agradecer pelo seu post e pelo seu retorno. Pois foi
atravs dele que comeou a sair meu primeiro laboratrio. E olhe que
eu pesquiso muito na net a procura do solues. Se voc tiver algum
material a respeito ou at mesmo um curso ficaria muito grato.
Andr Luis Celestino comentou em 21/09/2014 s 09:11
Legal, Alexandre! Fico feliz por ter contribudo para o seu primeiro
projeto.
Abrao!
Alexandre comentou em 28/09/2014 s 22:41
Boa noite, tudo bem ? Por um acaso voc teria algum exemplo de MVC
com Firedac ou onde eu poderia encontrar algum material a respeito ?
Obrigado.
Deixe um comentrio!
Nome (Obrigatrio)
E-mail (No ser publicado)
Site (Opcional)
2014 - SubRotina foi desenvolvido com WordPress por Andr Luis Celestino