Desde o começo, quando comecei a desenvolver pra web utilizando PHP, foram de cara duas paixões, a web e PHP.
No começo, todo desenvolvedor inicia logo sabendo como não se deve programar e no decorrer de sua experiência, adquire padrões e o métodos corretos de desenvolvimento de aplicações, ou não!
Não foi diferente comigo, eu comecei programação para sistemas web em PHP da forma mais comum, pilhas e pilhas de programação praticamente estruturadas, com monte de códigos “espaguete”, onde a manutenção era difícil, devido a grande agregação de código PHP com marcação HTML.
Mas como toda paixão passa pela maturação até que vire amor de verdade! Aprendi e descobri sobre o mundo OO, e minha iniciação foi como a primeira vez da maioria, na prostituição, pois é aprendi com Java! Brincadeira pessoal, não tenho nada contra Java, apenas não gosto da forma oferecida para o desenvolvimento web, complicada e cheia de configurações.
Mas Java me deu uma boa experiência, programação orientada a objetos e com isso um desafio, adaptar-me às boas práticas e iniciar o desenvolvimento em PHP de forma mais organizada, tornando os sistemas de fácil manutenção.
Um dos desenvolvimentos que me “excitei” bastante foi um de um site com recursos de galeria de produtos com imagens, para este eu desenvolvi uma classe de Imagem que faz o envio e redimensionamento, sei que isso tem aos montes nos banco de classes prontas, mas quando você desenvolve o seu próprio código se torna mais “sexy”!
Neste caso já utilizei OO, criei várias classes para as entidades do sistema, incluindo alguns DAOs e Facades. Algum tempo depois, ou seja, nos dias atuais, após ter aderido ao wordpress para gerenciamento dos sites, percebi que esta escolha não é a mais adequada para todos os projetos, então retomei o trabalho e comecei novamente o sistema particular de gerenciamento de conteúdo, só que desta vez com uma motivação maior, pois estou tendo aulas de MAP e conhecendo detalhes de alguns padrões de projeto como AbstractFactory, Template Method, entre outros.
No desenvolvimento, criei uma biblioteca denominada “comum” onde aloquei um módulo de classe genéricas e interfaces que poderia ser reusadas nos demais módulos do sistema, criei o sistema todos modularizado, e dentre os módulos, está novamente o meu bom e velho componente de upload, só que desta vez, deixou de apenas uma classe que consegui subdividir ao ponto de ganhar mais três classes, uma interface e uma classe abstrata, e com isso surgiram algumas dúvidas nesta arquitetura.
De início, comecei a montar o módulo com a seguinte divisão:
- interface ImageUploaderIF{} : uma interface definindo os seguintes métodos a serem implementados enviar(), processarEnvio() e redimensionarImagem(), onde enviar() seria responsável pela chamada aos outros dois métodos.
- abstract class AbstractImageUploader implements ImageUploaderIF{} : classe abstrata que implementa a interface acima, com o intuito de aplicar o padrão template method, então a classe abstrata implementaria apenas o método enviar(), deixando os demais para suas subclasses.
- class ImageUploader extends AbstractImageUploader{} : Subclasse de AbstractImageUploader que deveria implementar os métodos restantes, e definir sua forma de processar o envio e redimensionamento
Tudo parecia bem, porém de cara houve um problema, quando apliquei o template method, o único método que seria público é o enviar() os demais deveriam ser privados, visto que apenas poderiam ser invocados dentro do método enviar().
Daí já tive que eliminar o uso da interface, pois interfaces só definem métodos públicos, não poderia definir os outros como privados, sendo assim, também não poderia definí-los comos privados ou protected na classe abstrata também, pois só é possível aumentar a visibilidade métodos nas heranças e não diminuir.
Tive que prosseguir, aplicando o template method, utilizando apenas a classe abstrata e sua subclasse. Uma outra mudança foi no envio de um arquivo, eu não poderia simplesmente enviar o arquivo e salvá-lo em algum local, então criei um entidade para representar o arquivo enviado, criei a classe Arquivo, que definiria as propriedades do arquivo enviado como descrição, caminho, largura, altura, tamanho do arquivo em bytes e tipo de arquivo.
Pois é, de uma única classe que tinha pra fazer upload, que simplesmente retornava o caminho do arquivo enviado, agora tenho classes abstratas e suas subclasses.
No sistema também passei a usar uma fábrica de objetos ( Abstract Factory ), fábrica de conexões ( Connection Factory ), alguns DAOs e FACADEs e interfaces genéricas para muitas destas classes.
Pois é, estou ansioso com este desenvolvimento, aplicando os padrões toda a programação em PHP que já me agrada bastante fica ainda mais sexy!
[]‘s