Revista Interdisciplinar Digitally signed by Revista Interdisciplinar DN: cn=Revista Interdisciplinar, o=UNIVAR, ou, [email protected], c=BR Date: 2009.12.09 11:19:35 -02'00' PADRÕES DE PROJETOS (DESIGN PATTERNS) PARA WEB COM PHP Carlos David Rocha de Souza1 RESUMO O desenvolvimento utilizando padrões de projeto (Design Patterns) não deve ser considerado uma maneira de reutilização de códigos prontos, mas sim boas idéias de desenvolvê-los. A finalidade deste artigo é mostrar boas práticas de programação orientada a objeto, com aplicação de padrões de projeto enterprise para solucionar o problema proposta pela aplicação web utilizando a linguagem de programação PHP5 (Hypertex Preprocessor), o servidor web/SGDB WampServer2.0h (Apache, PHP5, phpMyAdmin e MySQL) e IDE NetBeans 6.5. Palavras-chave: Design Patterns; PHP; MVC – Model View Controller. DESIGN PATTERNS FOR WEB WITH PHP ABSTRACT The development using Design Patterns should not be considered a way of reutilization of ready codes, but, good ideas for developing them. The objective of this article is to show good practice of programming guided to object, with application of Design Patterns enterprise to solve the problem proposed by the application web using the programming language PHP5 (Hypertex Preprocessor), the server web/SGDB WampServer2.0h (Apache, PHP5, phpMyAdmin and MySQL) and GO NetBeans 6.5. Key-Words: Design Patterns; PHP; MVC – Model View Controller. INTRODUÇÃO Logo após aprender uma linguagem de programação ao avaliar outros projetos e percebendo que códigos de outros desenvolvedores aparentam ser mais complexo e com um funcionamento melhor, daí geralmente nasce um questionamento de como alcançar tal grau de excelência no desenvolvimento de aplicativos. Neste artigo, trataremos do conceitos e práticas de regras ou padrões de projetos, comumente chamadas de Design Pattern que é uma maneira de alcançar um objetivo no desenvolvimento de aplicativos com linguagem de programação orientada a objetos codificando classes e métodos. Os padrões de projetos estão em um nível mais elevado do que o próprio código desenvolvido, buscando mostrar como alcançar um objetivo e auxiliando no desenvolvimento mais eficaz do código orientado a objeto. Dessa forma, além da usar a metodologia de pesquisa bibliográfica, neste artigo expressamos uma abordagem de estudo de caso ao exemplificar por meio de uma aplicação para web e seu caso de uso que utiliza design pattern para solucionar o caso proposto no desenvolvimento em camadas do aplicativo para otimizar a segurança do código. 2. PADRÃO DE PROJETO (DESIGN PATTERN) No desenvolvimento de sistemas de deparado algum problema que fica a impressão que já foi visto antes e criado uma solução para tal, porém não foi elaborado uma documentação sobre a solução nem se guardou em memória. ____________________________________ 1 Tecnólogo em Sistemas de Informação (2005); Especialista em ciências da computação (2007). Atuante na área da tecnologia da informação desde 1997. Atualmente é professor na Faculdades Unidas do Vale do Araguaia; Analista de redes na Bmz Couros Ltda e Desenvolvedor de Aplicações Orientadas a Objeto e para Web. E-mail: [email protected] É neste ponto que se aplica o padrão de projeto, pois para GABRIEL (2008), não é mais aceitável que a cada vez que deparasse com uma determinada situação, até repetitiva, tenha que se pensar novamente em uma busca de uma solução nova. O que dever ser feito no momento de identificação pela primeira vez de uma situação, é documentá-la. Para isso devese dar um nome, explicando o contexto no qual está inserida, descrevendo a solução encontrada e mostrando as consequências desta solução, de forma que da próxima vez que esta situação for identificada, conte com a ajuda dessa documentação para solucionar o problema. Este tipo de documentação da solução de um problema faz com que os profissionais menos experientes possam aprender a partir da experiência documentada de outros profissionais e não tenham um que começar do zero. Dessa forma evita-se erros cometidos anteriormente até que se chegue a um resultado ou solução satisfatória, ganhando tempo no desenvolvimento da aplicação final. A utilização de padrões de projetos no desenvolvimento de aplicações otimiza na elaboração da documentação facilitando na manutenção dos sistemas já existentes. Segundo GONÇALVES (2007), um padrão descreve um problema que ocorre inúmeras vezes em determinado contexto, e descreve ainda a solução para esse problema, de modo que essa solução possa ser utilizada sistematicamente em distintas situações. Para DALL’OGLIO (2007) um padrão pode ser definido como a abstração de uma forma concreta que se repete em um contexto específico não-arbitrário. Já MELO (2007) afirma que: Cada pattern é uma regra de trê partes, uma que expressa uma relação entre um certo contexto, um certo sistema de forças que ocorre repetidamente nesse contexto, e uma certa configuração de software que permite que estas forças sejam resolvidas. 3. TIPOS DE PADRÕES DE PROJETO Os padrões são organizados em grupos e nomeados a partir de suas funcionalidades de utilização. A seguir apresentaremos topicamente as descrições dos mais comuns. 3.1 Padrões Estruturais Descreve como os objetos interagem entre si. Em outras palavras, eles abordam o framework estrutural dos objetos: • Bridge: Separa uma abstração de sua implementação, de modo que as duas possam variar independentemente. • Adapter: Permite que dois objetos se comuniquem mesmo que tenha interfaces incompatíveis. • Composite: Agrupa os objetos em estrutura de árvore para representar a hierarquia do tipo partes - todo. O Composite permite que os clientes tratem objetos individuais e composições de objetos de maneira uniforme. • Decorator: Atribui responsabilidade adicionais a um objeto dinamicamente.O Decorator fornece uma alternativa flexível a subclasses para a extensão da funcionalidade. • Facade: Fornece uma interface única para um subsistema com diversas interfaces. O Façade define uma interface de nível mais alto que torna o subsistema mais fácil de usar. • Flyweight: Usa compartilhamentos para dar suporte inúmeros objetos, de granularidade fina, de forma eficiente. • Proxy: Fornece um objeto representante ou marcador de outro objeto, para controlar o acesso ao mesmo. 3.2 Padrões Comportamentais Descreve como podemos usar os objetos para alterar o comportamento de um sistema em tempo de execução: • Observer: Define um uma dependência um-para-muitos entre objetos, de modo que, quando um objeto muda de estado todos os seus dependentes são notificados e atualizados. • Mediator: Cria um objeto que age como um mediador, controlando a interação entre um conjunto de objetos. • Chain of Responsibility: Evita o dependência do remetente (cliente) de uma requisição ao seu destinatário, dando a oportunidade de mais de objeto tratar a requisição. • Command: Encapsula uma requisição como um objeto, desta forma permitindo que você parametrize clientes de diferentes solicitações. • Interpreter: É usado para ajudar uma aplicação a entender uma declaração de linguagem natural e executar a funcionalidade da declaração. • Iterator: Oferece um método (um meio) para fazer acesso aos elementos de uma coleção. • Visitor: É usado Quando as operações necessitam ser realizadas sobre inúmeros elementos de um modelo de objeto. • Template Method: Define o esqueleto de um algoritmo em uma operação, adiando a definição de alguns passos para as subclasses. • Memento: Possibilita armazenar o estado de um objeto de modo que o mesmo possa ser recuperado. • State: Permite que um objeto altere seu comportamento quando se estado interno muda. • Strategy: Define uma família de algoritmos, encapsular cada um deles e fazêlos intercambiáveis. 3.3 Padrões de Criação São utilizados no instante da criação do objeto e são divididos em: • Abstract Factory: Provê uma interface para criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. • Factory Method: Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe a ser instanciada. • Singleton: Garante que uma classe tenha somente uma "instance" (objeto) Builder Separa a construção de um objeto complexo da sua representação, de modo que o mesmo processo de construção possa criar diferentes representações. • Prototype: Especifica os tipos de objetos a serem criados usando uma "instance" prototípica e criar novos objetos copiando este protótipo. 3.4 Padrões Enterprise 3.4.1 MVC - Model-View-Controller O padrão Model-View-Controller é um padrão de arquitetura ou seja ele indica o que dever ser organização global do sistema. Ele sugere a separação por camadas modelo, visão e controle da aplicação: • Modelo (Model): encapsula o estado da aplicação, responde consulta do seu estado, expõe funcionalidade da aplicação, e notifica a visão de mudanças. • Controle (Controller): define comportamento do aplicativo, mapeia usuários gestores para atualizações no modelo, seleciona visão para resposta, um visão para cada funcionalidade. • Visão (View): detem o modelo, pede atualizações ao modelo, manda usuários gestores ao controlador, permite o controlador escolher visão. 4. AMBIENTES DE DESENVOLVIMENTO E USO DOS PADRÕES DE PROJETO Antes da escolha do padrão de projeto a ser adotado é importante conhecê-lo por completo, com a realização de uma leitura abrangente de sua fundamentação teórica. É recomendado que se se estude as seções de descrição do problema a ser solucionado e do padrão a ser adotado na solução, pesquise exemplos de códigos do padrão escolhido, defina nomes para os participantes do padrão que tenham sentido no contexto da aplicação. Também qe se defina de forma lógica e padronizada os nomes para as classes a serem criadas e codificadas, especifique nomes para aplicação e operações do padrão, que se codifique a operação para suportar as responsabilidades e colaborações presentes na solução do programa proposto. 4.1 – Ambientes de Desenvolvimento: Outro aspecto a considerar são as escolhas das ferramentas de auxílio ao desenvolvedor. Alguns dos ambientes de desenvolvimento mas utilizados e que trazem maior produtividade na implementação são: 4.1.1 NETBEANS O NetBeans no atual mercado de IDEs de desenvolvimento é considerado uma das melhores do mercado open source. Desenvolvida pela Sun Microsystems e mantida pela comunidade, a cada versão vem se mostrando uma madura e consistente ferramenta para desenvolvimento. No desenvolvimento de aplicações web essa IDE vem sendo uma excelente alternativa para aqueles que desejam desenvolver de forma rápida e simples suas aplicações, por possuir sistema de depuração em tempo de desenvolvimento, mostrando as falhas de digitação, variáveis não declaradas, métodos inexistentes, importações de bibliotecas entre outras funções. 4.1.2 WAMPSERVER WampServer é um software publicado sob a GNU General Public License desenvolvido pela PHP Team. É usado para instalar rapidamente no computador os softwares PHP 5, MySQL e Apache, disponibilizando suporte ao uso de scripts PHP localmente no windows. A versão da aplicação para sistema operacional Linux é Lamp que contem todos os aplicativos e funcionalidades da versão plataforma windows. 4.1.3 DBDESIGNER Editor visual para criação de banco de dados mySQL que integra criação, modelagem, desenvolvimento e manutenção dos bancos em um ambiente simples e agradável. Comparável com produtos como Oracle's Designer, IBM's Relational Rose, CA Erwin. O DBDesigner é OpenSource distribuído sobre a licença GPL. 4.2. Aplicação – ARTIGOMVCPHP Com a evolução da internet há uma crescente movimentação no desenvolvimento de sistema que sejam separados e desenvolvidos em camadas. Dessa forma, o problema proposto é desenvolver um aplicativo para web divido em camadas para ter uma maior proteção de seu código acesso rápidas e seguro a base de dados. Um aplicativo que na sua camada de apresentação ao browser do usuário não contenha scripts query que possam ser capturados e manipulados por hackers. Buscando a solução de tal problema, será adotado neste caso de uso o padrão de projeto Model-View-Controller. Onde a aplicação será dividida em camadas. A Primeira Camada Model (modelo) será codificada uma classe com o nome class.pessoa.php essa classe era responsável pelo modelo de negócios da aplicação nela será codificado os atributos, nome, endereço, bairro, cidade, uf, telefone, os métodos get e set para cada atributo, e os métodos para manipulações do banco de dados através de strings query, o método all( ) será responsável por efetuar uma consulta no banco de dados de todos os dados cadastrados e armazenado em um array, o método intoPessoa ( ) será responsável por pegar todos os dados instanciados no objeto pessoa e gravar no banco de dados, o método alterPessoa ( ) será responsável por alterar os dados já cadastrados em banco através de um identificador que será o idtbpessoa, o método delPessoa( ) será responsável por excluir informações cadastradas em banco através de um identificador que será o idtbpessoa. A Segunda camada Controller (Controlador) será responsável pelo comportamento do aplicativo, mapeando o acesso aos métodos contidos na class.pessoa.php a mesma será codificada com o nome class.control.pessoa ela terá o atributo control que recebera a string que o usuário desejar ter acesso, o método Controle será responsável por acessar o método all ( ) da classe model, o método cadPessoa será responsável pelo controle do método intoPessoa ( ) da classe model, o método alterPessoa ira controlar o método alterPessoa ( ) da classe model e o método delPessoa ira controlar o método delPessoa ( ) da class model. A Terceira camada é a responsável por interagir com o browser do usuário será codificada uma classe com o nome view_pessoa.php nela terá as chamadas do controlador pra visualização de dados e manipulações pelo browser do usuário onde o mesmo terá respostar em código HTML no protocolo http. A Camada conexão com SGDB e banco, será codificado uma classe php com o nome conexaoDB.php ela será responsável por estabelecer uma comunicação com o banco de dados artigodb e o SGDB MySQL. Antes e iniciar a programação dos códigos com o auxilio da ferramenta de modelagem de banco de dados o DBDesigner será criado um Diagrama de Entidades e Relacionamentos da tabela tbpessoa e depois sincronizar a modelagem com o banco para geração da tabela modelada. Figura 01 – DER tbpessoa Com o auxilio da IDE NetBeans será criado um projeto de modelagem UML com o nome UMLArtigoMVCPHP para criação da representação do diagrama de classes. Figura 02 – Diagrama de Classes Projeto artigomvcphp Utilizando a IDE NetBeans será criado um projeto para web e php com o nome artigomvcphp e salvo na pasta C:\wamp\www\artigomvcphp\ onde foi salva as codificações php. descritas abaixo, por meio do código responsável pela comunicação com SGDB MySQL e banco de dados: conexaoDB.php <?php $local = 'localhost'; $login = 'root'; $senha = ''; $banco = 'artigodb'; mysql_pconnect($local, $login, $senha); mysql_select_db($banco); ?> Logo a seguir, temos o código responsável pela primeira camada model (modelo): class.pessoa.php <?php require('../config/conexaoDB.php'); class Pessoa { public $nome; public $endereco; public $bairro; public $cidade; public $uf; public $telefone; public $idtbpessoa; protected function getNome(){ return $nome; } protected function getEndereco(){ return $endereco; } protected function getBairro(){ return $bairro; } protected function getCidade(){ return $cidade; } protected function getUf(){ return $uf; } protected function getTelefone(){ return $telefone; } protected function getIdtbpessoa(){ return $idtbpessoa; } protected function setNome($nome) { $this->nome = $nome; } protected function setEndereco($endereco) { $this->endereco = $endereco; } protected function setBairro($bairro) { $this->bairro = $bairro; } protected function setCidade($cidade) { $this->cidade = $cidade; } protected function setUf($uf) { $this->uf = $uf; } protected function setTelefone($telefone) { $this->telefone = $telefone; } protected function setIdtbpessoa($idtbpessoa) { $this->idtbpessoa = $idtbpessoa; } public function all() { $sql = "SELECT * FROM `tbpessoa`"; $result = mysql_query($sql); while($dados = mysql_fetch_array($result)) { $pessoa = new Pessoa(); $pessoa->setIdtbpessoa(array('idtbpessoa' => $dados['idtbpessoa'])); $pessoa->setNome(array('nome' => $dados['nome'])); $pessoa->setEndereco(array('endereco' => $dados['endereco'])); $pessoa->setBairro(array('bairro' => $dados['bairro'])); $pessoa->setCidade(array('cidade' => $dados['cidade'])); $pessoa->setUf(array('uf' => $dados['uf'])); $pessoa->setTelefone(array('telefone' => $dados['telefone'])); $arr[] = $pessoa; } return $arr; } public function intoPessoa($nome,$endereco,$bairro,$cidade,$uf,$telefone) { $sql = "INSERT INTO `tbpessoa` ( `idtbpessoa` , `nome`,`endereco`,`bairro`, `cidade`,`uf`,`telefone`) VALUES (NULL , '$nome','$endereco','$bairro','$cidade','$uf','$telefone');"; mysql_query($sql); } public function delPessoa($idtbpessoa){ $sql = "DELETE FROM `tbpessoa` WHERE `tbpessoa`.`idtbpessoa` = $idtbpessoa;"; mysql_query($sql); } public function alterPessoa($alteridtbpessoa,$alternome,$alterendereco,$alterbairro,$altercidade,$alteruf,$altertelefone){ if($alternome != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `nome` = '$alternome' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } if($alterendereco != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `endereco` = '$alterendereco' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } if($alterbairro != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `bairro` = '$alterbairro' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } if($altercidade != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `cidade` = '$altercidade' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } if($alteruf != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `uf` = '$alteruf' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } if($altertelefone != ''){ $sql= "UPDATE `artigodb`.`tbpessoa` SET `telefone` = '$altertelefone' WHERE `tbpessoa`.`idtbpessoa` =$alteridtbpessoa;"; mysql_query($sql); } } } ?> O fragmento do código responsável pela segunda camada controller(Controlador) está colocado a seguir: class.control.pessoa.php <?php require('../model/class.pessoa.php'); class Control { public $control; public function Controle() { $this->control = new Pessoa(); return $this->control->all(); } public function alterPessoa($alteridtbpessoa,$alternome,$alterendereco,$alterbairro,$altercidade,$alteruf,$altertelefone){ if($alteridtbpessoa == ''){ print "=*Ao alterar uma pessoa, é obrigatório informar o ID.<br>"; }else{ $this->control = new Pessoa(); $this->control>alterPessoa($alteridtbpessoa,$alternome,$alterendereco,$alterbairro,$altercidade,$alteruf,$altertelefone); } } public function delPessoa($idtbpessoa){ if($idtbpessoa == '' ){ print "=* Se estiver tentando excluir uma pessoa, não esqueça de informar o ID.<br>"; } else{ $this->control = new Pessoa(); $this->control->delPessoa($idtbpessoa); print " -Pessoa excluido com sucesso!.<br>"; } } public function cadPessoa($nome,$endereco,$bairro,$cidade,$uf,$telefone) { if($nome == '' || $endereco == '' ||$bairro == '' ||$cidade== '' ||$uf == '' ||$telefone == '') { print "=*Ao inserir um registro é obrigatório informar: Nome, endereco, bairro, cidade, uf, telefone <br>"; } else { $this->control = new Pessoa(); $this->control->intoPessoa($nome,$endereco,$bairro,$cidade,$uf,$telefone); A seguir temos o fragmento do código responsável pela terceira camada view(Visão): view_pessoa.php <?php require('../control/class.control.pessoa.php'); . . <body> <p>Gravar Informações Pessoa</p> <form id="form1" name="form1" method="post" action=""> <table width="707" height="242" align="left"> <tr> <td colspan="2">Formulário de Cadastro de Pessoas</td> </tr> <tr> <td width="61">Nome:</td> <td width="630"><label> <input name="nome" type="text" id="nome" size="102" maxlength="100" /> </label></td> </tr> <tr> <td>Endereço:</td> <td><input name="endereco" type="text" id="endereco" size="102" maxlength="100" /></td> </tr> <tr> <td>Bairro:</td> <td><input name="bairro" type="text" id="bairro" size="52" maxlength="50" /></td> </tr> <tr> <td>Cidade:</td> <td><input name="cidade" type="text" id="cidade" size="102" maxlength="100" /></td> </tr> <tr> <td>UF:</td> <td><select name="uf" id="uf"> <option value="AM">AM</option> <option value="MT">MT</option> </select> <label></label></td> </tr> <tr> <td>Telefone</td> <td><input name="telefone" type="text" id="telefone" size="16" maxlength="14" /></td> </tr> <tr> <td height="43" colspan="2"><label> <input type="submit" name="button" id="button" value="Gravar" /> </label></td> </tr> </table> </form> <p>Alterar Informações Cadastradas</p> <form id="form2" name="form2" method="post" action=""> <table width="707" height="242" align="left"> <tr> <td colspan="2">Formulário de Manutenção de Pessoas</td> </tr> <tr> <td width="61">ID:</td> <td width="630"><label> <input name="alteridtbpessoa" type="text" id="alteridtbpessoa" size="13" maxlength="11" /> </label></td> </tr> <tr> <tr> <td width="61">Nome:</td> <td width="630"><label> <input name="alternome" type="text" id="alternome" size="102" maxlength="100" /> </label></td> </tr> <tr> <td>Endereço:</td> <td><input name="alterendereco" type="text" id="alterendereco" size="102" maxlength="100" /></td> </tr> <tr> <td>Bairro:</td> <td><input name="alterbairro" type="text" id="alterbairro" size="52" maxlength="50" /></td> </tr> <tr> <td>Cidade:</td> <td><input name="altercidade" type="text" id="altercidade" size="102" maxlength="100" /></td> </tr> <tr> <td>UF:</td> <td><select name="alteruf" id="alteruf"> <option value="AM">AM</option> <option value="MT">MT</option> </select> <label></label></td> </tr> <tr> <td>Telefone</td> <td><input name="altertelefone" type="text" id="altertelefone" size="16" maxlength="14" /></td> </tr> <tr> <td height="43" colspan="2"><label> <input type="submit" name="button" id="button" value="Alterar" /> </label></td> </tr> </table> </form> <p>Exluir Informações Cadastradas</p> <form id="form3" name="form3" method="post" action=""> <table width="707" height="98" align="left"> <tr> <td height="33" colspan="2">Formulário de Exclusão de Pessoas</td> </tr> <tr> <td width="61" height="29">ID:</td> <td width="630"><label> <input name="idtbpessoa" type="text" id="idtbpessoa" size="13" maxlength="11" /> </label></td> <td height="26" colspan="2"><label> <input type="submit" name="button" id="button" value="Excluir" /> </label></td> </tr> </table> </form> <p align="left">Lista dos Dados Cadastrados</p> <table width="1234" align="left"> <tr bordercolor="#FFFFFF" bgcolor="#333333"> <td width="68"><div align="left" class="style1">Código</div></td> <td width="278"><div align="left" class="style1">Nome</div></td> <td width="223"><div align="left" class="style1">Endereço</div></td> <td width="156"><div align="left" class="style1">Bairro</div></td> <td width="288"><div align="left" class="style1">Cidade</div></td> <td width="32"><div align="left" class="style1">UF</div></td> <td width="143"><div align="left" class="style1">Telefone</div></td> </tr> <?php $c = new Control(); $arr = $c->Controle(); for ($i = 0; $i < count($arr); $i++) { ?> <tr bgcolor="#CCCCCC"> <td><div align="left" class="style2"> <?php print $arr[$i]->idtbpessoa['idtbpessoa']; . . print $arr[$i]->telefone['telefone']; ?> </div></td> </tr> <?php } ?> </table> <p>&nbsp;</p> <p>&nbsp;</p> </body> </html> Efetuando o acesso com o browser, pode ser visualizado o resultado da aplicação e envio de pedidos para manipulação de dados. A figura abaixo demonstra visualização do browser cliente: Figura 03 – Tela do Browser CONSIDERAÇÕES FINAIS O principal propósito deste artigo foi proporcionar ao leitor um estudo de caso que demonstrasse na pratica como utilizar um padrão de projeto em uma aplicação web. O estudo foi realizado com a linguagem de programação PHP5 para codificação de suas classes. Os padrões de projetos vão mais alem do que a própria programação do código e da engenharia de seus diagramas, a sua principal busca é a melhoria da lógica de solução de problemas propostos reutilizando o padrão em outras aplicações. Havendo necessidade de criação de novas telas de cadastro bastaria ao desenvolvedor utilizar o mesmo padrão adotado e testando para criação das classes de model, controller e view. Levando em consideração que um dos maiores problemas, falando em desenvolvimento de sistemas, não é codificação inicial, mas sim a manutenção do código, com o padrão adotado no artigo o MVC isso seria solucionado já que ele trabalha em camadas facilitando a manutenção de suas telas lembrando que o plano de negócio estaria protegido contra possíveis erros de codificação. REFERÊNCIAS BIBLIOGRÁFICAS DALL’OGLIO, Pablo. PHP – PROGRAMAÇÃO COM ORIENTAÇÃO A OBJETO: design patterns: São Paulo – SP. Novatec Editora Ltda 2007. MELO, Alexandre Altair de. PHP – PROFISSIONAL: design patterns, wampserver: São Paulo – SP. Novatec Editora Ltda 2007. GONÇALVES, Edson. DESENVOLVENTO APLICAÇÕES WEB: model-viewcontroller: Rio de Janeiro – RJ. Editora Ciência Moderna Ltda 2007. GONÇALVES, Edson. DESENVOLVENTO APLICAÇÕES WEB COM NETBEANS IDE 6: model-view-controller, netbeans: Rio de Janeiro – RJ. Editora Ciência Moderna Ltda 2008.