Your SlideShare is downloading. ×
Seminário PHP em Porto Alegre. Traits no PHP 5.4: muito além da herança
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Seminário PHP em Porto Alegre. Traits no PHP 5.4: muito além da herança

457
views

Published on

Palestra proferida na Uniritter em Porto Alegre sobre a implementação de traits no PHP 5.4 que possibilita ao programador vencer a limitação de reuso da orientação a objetos.

Palestra proferida na Uniritter em Porto Alegre sobre a implementação de traits no PHP 5.4 que possibilita ao programador vencer a limitação de reuso da orientação a objetos.

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
457
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits no PHP 5.4:muito além da herançaFlávio Gomes da Silva Lisboa@fgsl
  • 2. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Quem sou eu2
  • 3. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Quem sou eu
  • 4. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Quem sou eu
  • 5. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Especialista em história emquadrinhos http://perse.doneit.com.brromocavaleirodoespaco.blogspot.com
  • 6. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Não seria maravilhoso se existisse uma maneira decriar um software de modo que quandoprecisássemos alterá-lo, pudéssemos fazer issocom o menor impacto possível no código existente?Poderíamos perder menos tempo retrabalhando ocódigo e mais tempo para permitir que o programafaça coisas mais legais...
  • 7. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Princípio de Design“Identifique os aspectos de seu aplicativo quevariam e separe-os do que permanece igual”.Eric e Elisabeth Freeman
  • 8. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.ResumoEsta palestra mostra como traits resolvem umproblema relativo à limitação do reuso porherança em orientação a objetos e como sãoimplementados no PHP 5.4.
  • 9. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Tudo começou aquiEuropean Conference onObject-Oriented Programming
  • 10. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.PaperTraits: “unidades de comportamentoque podem compor algo”Schärli, Ducasse, Nierstraz e Black
  • 11. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Fato: “A herança é o mecanismo dereuso fundamental nas linguagens deprogramação orientadas a objetos”
  • 12. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Fato: “Todas as variantes de herançasofrem de problemas conceituais epráticos”
  • 13. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Fato: “A herança é um mecanismo commuitos significados e interpretaçõesconflitantes”
  • 14. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.A programação de computadores seapropria de termos de outras áreasde conhecimento fazendo analogias
  • 15. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 16. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Seria a herança genética?
  • 17. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Na herança genética, cada filhorecebe uma combinação decaracterísticas do pai e da mãe... eisso é naturalmente probabilístico
  • 18. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Existem dois tipos de herança naprogramação orientada a objetos● Simples: uma classe herda TODASas características herdáveis de outra● Múltipla: uma classe herda TODAS ascaracterísticas herdáveis de mais deuma classe.
  • 19. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Esses dois tipos são determinísticos● Em ambos os tipos, existe uma formade dizer o que será ou não herdado,que é o escopo de visibilidade deatributos e métodos.
  • 20. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.A herança em orientação a objetosseria um testamento, em que asclasses pais transmitem todos osseus bens (atributos e métodos)para as classes filhas?
  • 21. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Mas esta não é aherança simplesda orientação a objetos
  • 22. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Nem esta:
  • 23. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.O problema com a analogia dotestamento, é que nesse caso cadaherdeiro leva uma parte daherança.E não é isso que acontece com aorientação a objetos, na qual a cadaclasse filha leva toda a herança.
  • 24. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.A herança simples daorientação a objetos, então, é esta:
  • 25. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Na herança simples, várias classespodem reutilizar atributos e métodosde uma classe ancestral.Mas o reuso não é pleno, já que, por herdar deapenas uma classe, você pode acabar “copiando”atributos e métodos de outra classe, gerandocódigo duplicado.E o código duplicado é mutante: você não temum controle fácil sobre implementações.
  • 26. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Herança simples e código duplicado
  • 27. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Nem pense nisso!Criar dependências implicaem diminuir a flexibilidade
  • 28. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Na arquitetura do software énecessário encontrar um ponto deequilíbrio entre instabilidade eabstração
  • 29. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.E a herança múltipla?AnimalCavalo PássaroPégaso
  • 30. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Seria isto?Animal
  • 31. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Seria isto?AnimalNÃO!
  • 32. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Seria mais parecido com isso:Homem
  • 33. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.“A herança múltipla é boa, mas nãohá um bom modo de fazê-la”Steve CookA herança múltipla permitiria combinar atributose métodos de várias classes em uma novaclasse.Mas existem vários problemas decorrentes daherança múltipla... por isso PHP não aimplementa.
  • 34. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Ah, mas eu posso usar interfaces...
  • 35. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Sim, mas interfaces não temimplementação. O problema nãoé padronizar a comunicação,mas reutilizar código.
  • 36. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Existe um problema:o Diamante da Morte
  • 37. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Problema do Diamante
  • 38. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Problema do DiamanteConflito de nomes:Se existem atributosou métodoscom nomes iguais,mas contextos diferentes,qual deve ser herdado?
  • 39. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Problema do DiamanteImplementação:Se um método de umaclasse ancestral forsobrescrito pelas classesherdadas, qualimplementação seráusada?
  • 40. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Herança múltipla não é genética...Herança múltipla traz tudo de todos os pais.E nem sempre (talvez na maioria dos casos)queremos combinar tudo de todos, mas algumascoisas de todos.Não queremos gerar um clone (até porque não dápra gerar um clone de mais de um original) masuma combinação de traços (atributos e métodos).
  • 41. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Composição de classes é umpaliativoVocê pode contornar a inexistência de herançamúltipla fazendo com que uma classe contenhaoutra, em vez de estendê-la.Com essa abordagem, uma classe podeartificialmente herdar tanto atributos quantométodos de múltiplas classes.Mas persiste o problema de que é tudo ou nada.
  • 42. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Composição de classes é umpaliativo<?phpnamespace DCComicsCharacters;class Amazo{private $decorators = array();public function __construct(){$this->decorators[] = new Superman();$this->decorators[] = new MartianManhunter();}}
  • 43. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Composição de classes é umpaliativo
  • 44. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Composição de classes é umpaliativo
  • 45. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Paradoxo da Herança de ClassesUma classe tem um papel primário de geradorade instâncias, logo ela deve ser completa.Mas como unidade de reuso, uma classe deveser pequena, com a menor implementaçãopossível.Isso é contraditório!
  • 46. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Separação de papéisSe a classe deve ser a geradora de instâncias,alguém tem de assumir o papel de unidade dereuso. É aí que entram os traits.Traits são unidades primitivas de reuso de código.
  • 47. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits►Um trait provê um conjunto de métodos queimplementam comportamento.►Classes e traits podem ser compostos por outros traits.►Métodos conflitantes devem ser explicitamenteresolvidos.►A composição com traits não afeta a semântica daclasse. É como se os métodos fossem declarados nela.
  • 48. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Classes e Verbos►Herança de classe: Ser►Composição de classe: Ter (ter é melhor que ser)►Traits: Usar (usar é melhor que ter)
  • 49. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Declarando um trait em PHPtrait GenericTrait{public function doSomeSingle(){echo something single;}}Traits não podem ser instanciados, apenas usados!
  • 50. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Usando um trait em PHPclass ClassC{use SpecialTrait;}Se uma classe herda um método que tem omesmo nome de um método contido em um trait, otrait sobrescreve o método herdado.Tesoura corta papel. Trait corta classe mãe.
  • 51. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Usando vários traits em PHPclass Amazo{use Aquaman, Flash;}
  • 52. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Sobrescrevendo um trait em PHPclass ClassB{use GenericTrait;public function doSomeSingle(){echo Something single infact;}}O método da classe tem precedência sobre o trait!
  • 53. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitostrait Fifer{public function buildHouse(){echo building a strawhouse;}}
  • 54. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitostrait Fiddler{public function buildHouse(){echo building a stickhouse;}}
  • 55. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitostrait Practical{public function buildHouse(){echo building a brickhouse;}}
  • 56. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitosclass PerfectPig{use Fifer, Fiddler, Practical;}
  • 57. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitosclass PerfectPig{use Fifer, Fiddler, Practical{Practical::buildHouse insteadofFifer, Fiddler;}}
  • 58. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Resolução de conflitosclass PerfectPig{use Fifer, Fiddler, Practical{Practical::buildHouse insteadofFifer, Fiddler;Fifer::buildHouse as buildShitHouse;}}
  • 59. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Trait > (Interface + Implementação)● Uma classe não pode implementar duasinterfaces que tenham métodos com mesmonome.● Interfaces não suportam atributos, apenasconstantes.● Os métodos de uma interface tem de serpúblicos.
  • 60. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits suportam atributos● Você pode definir atributos, inclusive estáticos,da mesma forma como faz em classes.trait StaticTrait{public static $instances;public $description;}
  • 61. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits podem usar variáveisestáticas● Só não podem defini-las.trait StaticTrait{public function $playDice(){static $side = 1;$side++;if ($side > 6) $side = 1;return $side;}}
  • 62. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Classes podem alterar a visibilidadede métodos de traits● Métodos públicos podem se tornar privados ouprotegidos.class ClassC{use SpecialTrait{doSomeSpecial as protected;}}
  • 63. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits podem declarar métodosabstratos● Dessa forma, um trait pode também se tornarum contrato, como uma interfacetrait BaseTrait{public function doSomeAbstract();}
  • 64. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Traits podem usar traits● Métodos públicos podem se tornar privados ouprotegidos.trait OneTrait{use OtherTrait;}
  • 65. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Existem funções para Traits● class_uses: retorna os traits usados pelaclasse dada.● get_declared_traits: retorna os array de todosos traits declarados.● trait_exists: verifica se o trait existe.
  • 66. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.http://www.treinaweb.com.br15 de junho
  • 67. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.É isso aí, pessoal!● www.fgsl.eti.br● flavio.lisboa@fgsl.eti.br● @fgsl
  • 68. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.Referências● Schärli, N. et alli. Traits: Composable Units ofBehaviour.http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf● Weldon, G. PHP 5.4: Begin your love affair with Traits.http://www.slideshare.net/predominant/php-54-begin-your-love-affair-with-traits-10118525