sexta-feira, 4 de novembro de 2011

Polimorfismo e Herança no PHP

Olá meus amigos e amigas tudo bem? Hoje vou falar de um assunto atípico dos meus posts... hoje vou falar sobre Polimorfismo e Herança no PHP. E se você acha que não existe isso no php tome cuidado com o que fala, o php vem evoluindo muito!

Uma classe é uma estrutura básica para a criação de objetos ou seja, vários objetos podem ser criados seguindo a mesma estrutura, porém com dados diferentes. 
Em algumas casos é necessários ter objetos idênticos com algumas funcionalidades a mais ou então com as mesmas funcionalidades, mas com comportamentos diferentes...

Herança

O que será esse carinha? Herança faz parte de um dos 3 pilares da POO uma herança é a
forma de um filho obter características do pai na vida real concorda? Na POO também é assim...

Por exemplo um carro e uma moto possuem características bem parecidas. Ambos possuem rodas e marchas que são semelhantes em qualquer veículo.
Pensando assim podemos dizer que carro é um veículo, assim como uma moto também é um veículo concordam? Logo carro e moto herdam características de veículo.

Esse exemplo é muito simples no php, e para herdar de uma classe utilizamos o 'extends' veja:



  1. <?php
  2. class Veiculo
  3. {
  4.         private $marcha;
  5.         private $quantidadeRodas;
  6.         public function passarMarcha()
  7.         {
  8.                 // código
  9.         }
  10.         public function andar()
  11.         {
  12.                 // código
  13.         }
  14. }
  15. class Carro extends Veiculo
  16. {
  17.         public function __construct()
  18.         {
  19.                 $this->quantidadeRodas = 4;
  20.         }
  21. }
  22. $carro = new Carro();
  23. $carro->andar();



Veja só, criamos a classe veículo com atributos marcha e quantidadedeRodas e criamos uma classe carro que extende da veículo já com o construtor montando a quantidade de rodas. simples não? Herança SUALINDA :D


Polimorfismo

Poli o que? Oo'
POLIMORFISMO! Mas o que é isso? Vamos primeiro entender a palavra, polimorfismo significa muitas formas (poli: muitas, morphos: formas). Esse conceito é perfeito pois na POO significa que várias classes podem possuir a mesma estrutura e comportamentos diferentes. Quando utilizamos herança não apenas podemos reutilizar métodos da classe pai, como também podemos sobreescrever os métodos da classe pai, fazendo assim com que certas características sejam modificadas para a determinada classe.

Vamos imaginar que um banco possui dois tipos de cheques; o chque comum e o especial. Os dois possuem a mesma estrutura o que diferencia um do outro é a forma de cobrança de juros. O comum cobra 25% em cima do valor e o cheque especial o valor dos juros de 10% como podemos fazer sem escrever a mesma coisa? Assim:



  1. <?php
  2. class ChequeComum
  3. {
  4.     protected $valor;
  5.         // ... outros métodos da classe
  6.         public function setValor( $valor )
  7.         {
  8.                 $this->valor = $valor;
  9.         }
  10.         public function getValor()
  11.         {
  12.                 return $this->valor;
  13.         }
  14.         public function calculaJuros()
  15.         {
  16.                 return $this->valor * 1.25; // soma 25% em cima do valor
  17.         }
  18. }
  19. class ChequeEspecial extends ChequeComum
  20. {
  21.         public function calculaJuros()
  22.         {
  23.                 return $this->valor * 1.10; // soma 10% em cima do valor
  24.         }
  25.        
  26.         public function calculaJurosPai(){
  27.                 return $this->valor = parent::calculaJuros();
  28.         }
  29. }
  30. $cheque = new ChequeEspecial();
  31. $cheque->setValor(1000);
  32. //CHAMANDO DA PRÓPRIA CLASSE
  33. echo $cheque->calculaJuros();
  34. echo "<hr>";
  35. //CHAMANDO DA CLASSE PAI
  36. echo $cheque->calculaJurosPai();
Antes de mais nada veja que na classe ChequeComum criei o atributo $valor com o acesso 'protect' ou seja, disse que ele é protegido assim pode ser acessado pela própria classe e classes que 'ligam' ela.

Perceba que na classe ChequeEspecial eu criei um método chamado calculaJurosPai ele foi apena para mostrar que se existir a necessidade do uso de um método sobrescrito devemos acessar ele paralelamente dessa forma (parent::).
Como exemplo eu criei o objeto e exibi os dois calcula juros...

Legal não é? Agora utilize =]

Obrigado e até a próxima

segunda-feira, 24 de outubro de 2011

Desenvolvimento ágil com XP (Extreme Programming)

Amigos e amigas hoje vou falar um pouco sobre mais uma metodologia ágil de desenvolvimento (a mais conhecida) XP.
XP nesse caso não é aquele sistema operacional da microsoft ok? Mas sim as siglas de EXTREME PROGRAMMING traduzindo Programação extrema

Talvez você esteja se perguntando; "Será que para desenvolver uma aplicação de maneira rápida eu vou precisar de um capacete e uma luva?" 
A resposta é não, mas se você quiser utilizar, eu acredito que os acessórios pouco importa com tanto que vc esteja preparado para a agilidade do XP rsrs...


Pv... me explica por favor oq é esse XP? XP significa Programação extrema (do inglês eXtreme Programming), ele é uma metodologia ágil para equipes pequenas e médias e que irão desenvolver software com requisitos vagos e em constante mudança, ou seja a melhor escolha para o mundo hoje em dia não acham? Na maioria dos casos os requisitos sempre são alterados e assim não é possível trabalhar sempre em cima de uma base de análise pois o que foi planejado ontem pode ser alterado, hoje em dia desenvolvimento de sistemas não é como antigamente em que um software era engessado.

Para isso, adota a estratégia de constante acompanhamento e realização de vários pequenos ajustes durante o desenvolvimento de software.

Breve histórico
Nascida nos Estados Unidos ao final da década de 90 por Kent Beck. Vem fazendo sucesso em diversos países, por ajudar a criar sistemas de melhor qualidade, que são produzidos em menos tempo e de forma mais econômica que o habitual. Tais objetivos são alcançados através de um pequeno conjunto de valores, princípios e práticas, que diferem substancialmente da forma tradicional de se desenvolver software.

O XP assim como outras metodologias faz parte do Manifesto ágil um manifesto iniciado nos Estados Unidos em que se prega novos e interessantes valores para o desenvolvimento de software como por exemplo:
  • Indivíduos e interação entre eles mais que processos e ferramentas;
  • Software em funcionamento mais que documentação abrangente;
  • Colaboração com o cliente mais que negociação de contratos;
  • Responder a mudanças mais que seguir um plano.
Perceba que o manifesto ágil busca uma outra visão no desenvolvimento de software, busca a criação de um projeto de forma ágil e o que é muito importante falar atendendo expectativas.

TA MAS COMO UTILIZAR O XP?
'Utilizar' o XP no desenvolvimento de um projeto é mais fácil e simples do que parece basta entender seus valores e princípios e assim aplica-los no desenvolvimento.



Princípios básicos
Para o desenvolvimento ágil, é necessário entender que essa metodologia se baseia em principios básicos que são:
  • Feedback rápido
  • Presumir simplicidade
  • Mudanças incrementais
  • Abraçar mudanças
  • Trabalho de alta qualidade


Ou seja é necessário feedback rápido da situação do desenvolvimento, módulos e funcionalidades tanto para o cliente como para a equipe. Programar, desenvolver e resolver problemas  complexos é uma tarefa perigosa pois para um problema pode ser encontrado diversas soluções mas qual é a melhor? A melhor é a mais simples, aquela clara e explicita por isso presumir simplicidade. Mudanças acontecem normalmente e devem ser encaradas e analisadas por isso Mudanças incrementais, as mudanças são bem vindas e é necessário abraça-las mas com um bom planejamentos por isso Abraçar mudanças e por ultimo desenvolver algo deve ser levado a sério, deve-se buscar a máxima excelência e qualidade no trabalho.


Valores
Os cinco valores fundamentais da metodologia XP são: comunicação, simplicidade, feedback, coragem e respeito.
Dentre as variáveis de controle em projetos (custo, tempo, qualidade e escopo), existe uma atenção principal no escopo. 
Por isso, recomenda-se priorizar funcionalidades que representam maior valor possível para o negócio, ou seja trabalhar na regra de negócio principal do software. E assim se for necessário a diminuição de escopo, as funcionalidades menos valiosas serão adiadas ou canceladas.


Práticas
Para aplicar esses valores e princípios no desenvolvimento, o XP propõe uma série de práticas. Há uma confiança muito grande na sinergia entre elas, os pontos fracos de cada uma são superados pelos pontos fortes de outras.

Jogo de Planejamento (Planning Game):
O desenvolvimento é feito em ciclos semanais. No início da semana, desenvolvedores e cliente reúnem-se para priorizar as funcionalidades. O nome dessa reunião é Jogo do Planejamento. Nela, o cliente identifica prioridades e os desenvolvedores dão um prazo provavel. A principal peça desse 'jogo' é o cliente pois ele define funcionalidades, fica sabendo o que está acontecendo e o que vai acontecer no projeto. Como o escopo é reavaliado semanalmente, o projeto é regido por um contrato de escopo negociável, que difere significativamente das formas tradicionais de contratação de projetos de software. Ao final de cada semana, o cliente recebe novas funcionalidades, completamente testadas e prontas para serem postas em produção.

Pequenas Versões (Small Releases): Liberar versões funcionais auxilia muito na aceitação por parte do cliente, que já pode testar uma parte do sistema que está comprando.

Metáfora (Metaphor): Busca facilitar o entendimento na comunicação com o cliente, por exemplo um processo de 2 semanas para um advogado é algo rápido, enquanto que gerar boletos em 2 semanas é algo extramamente lento para um banqueiro, e ambos são lentos para um select que um programador espera o retorno. Sendo assim o intuito dessa prática é entender o que algo significa para o cliente.

Projeto Simples (Simple Design): Simplicidade é um príncipio da XP, ou seja fazer conforme a necessidade manda, buscando clareza e padronização. Desenvolver simples significa pensar claro, alcançar objetivos e otimizar sempre a realização. Por exemplo se você pretende reutilizar uma classe Pessoa com um método Programar pense bem e veja se não é melhor criar uma classe Programador que extenda da Pessoa e assim colocar esse método pois um programador é uma pessoa mas só ele programa, uma pessoa é uma pessoa e nem sempre ela programa. Atingir o objetivo simples e desenvolver com lógica faz parte desse princípio.

Testes de Aceitação (Customer Tests): São testes construídos pelo cliente e conjunto de analistas e testadores, para aceitar um determinado requisito do sistema.


Ritmo Sustentável (Sustainable Pace): Trabalhar com qualidade, buscando ter ritmo de trabalho saudável (40 horas/semana, 8 horas/dia), sem horas extras. Horas extras são permitidas quando trouxerem produtividade para a execução do projeto. Outra prática que se verifica neste processo é a prática de trabalho energizado, onde se busca trabalho motivado sempre. Para isto o ambiente de trabalho e a motivação da equipe devem estar sempre em harmonia.

Reuniões em pé (Stand-up Meeting): Reuniões em pé para não se perder o foco nos assuntos, produzindo reuniões rápidas, apenas abordando tarefas realizadas e tarefas a realizar pela equipe.



Programação em Pares (Pair Programming): é a programação em dupla ou seja, duas pessoas em um computador, normalmente um é o 'piloto' e o outro o 'co-piloto' os dois desenvolvem juntos sendo que um fica codificando e o outro analisando e falando, assim é a atenção de duas pessoas em um desenvolvimento garantindo muitas vezes boa qualidade, e ganho de tempo pois os dois estão focados em um objetivo, assim um puxa o outro.

Padrões de Codificação (Coding Standards): A equipe de desenvolvimento precisa estabelecer regras para programar e todos devem seguir estas regras. Desta forma parecerá que todo o código fonte foi editado pela mesma pessoa, mesmo quando a equipe possui 10 ou 100 membros.


Desenvolvimento Orientado a Testes (Test Driven Development): Conhecido como TDD onde primeiro se cria os testes unitários (unit tests) e depois cria-se o código para que os testes funcionem. Esta abordagem é complexa no início, pois vai contra o processo de desenvolvimento de muitos anos. Só que os testes unitários são essenciais para que a qualidade do projeto seja mantida.

Refatoração (Refactoring): É um processo que permite a melhoria continua da programação, com o mínimo de introdução de erros e mantendo a compatibilidade com o código já existente. Refabricar melhora a clareza (leitura) do código, divide-o em módulos mais coesos e de maior reaproveitamento, evitando a duplicação de código-fonte;


Integração Contínua (Continuous Integration): Sempre que produzir uma nova funcionalidade, nunca esperar uma semana para integrar à versão atual do sistema. Isto só aumenta a possibilidade de conflitos e a possibilidade de erros no código fonte. Integrar de forma contínua permite saber o status real da programação.


Conclusão
A XP é uma metodologia que é um reflexo do mundo hoje em dia, padronizar, agilizar, melhor e atender são objetivos que as práticas e valores do manifesto ágil busca atingir e a metodologia mais estável e renomada para isso é a XP.

Referências

Agile Software Development, Principles, Patterns, and Practices (ISBN 0135974445)
Extreme Programming Explained: Embrace Change (2nd Edition) (ISBN 0321278658)

UFA! Essa é a base do XP. Obrigado pela atenção e até a próxima!