SlideShare uma empresa Scribd logo
1 de 40
Como melhorar
seu código com
Laravel Collections
Aryel Tupinambá
PHP Conference 2017
Sobre o
palestrante
Aryel Tupinambá
@DfKimera
Co-fundador e CTO da
LQDI Digital
Projetos para empresas como Porto
Seguro, Nestlé, Ticket e American
Express
CTO da
PedeSabores.com.br
E-commerce de frutas, verduras,
legumes e outros produtos
alimentícios
13 anos trabalhando
com PHP
Desde a época que o PHPClasses
era a onda :)
O que são as Laravel Collections?
O que são as Laravel Collections
Representação OOP
de uma array
Atua como um wrapper de
uma array ou data source
(database, CSV/XLS, etc)
Programação
funcional e method
chaining
Uma centena de
operações de busca,
manipulação e
transformação
composer require illuminate/support
Instalação e uso
O que vem no pacote
Arr Str Collection Carbon
Arr::add()
Arr::except()
Arr::only()
Arr::first()
Arr::random()
...
Str::finish()
Str::camelCase()
Str::snakeCase()
Str::startsWith()
Str::slug()
Str::contains()
...
collect()
Carbon::parse('2017-12-07')
$date->before()
$date->add()
$date->endOfMonth()
$date->diffInHours()
...
Principais métodos
map()
Retorna uma nova array, onde cada elemento é o resultado da
função de callback (índices preservados)
filter()
Retorna uma nova array, apenas com os ítens cujo callback retornar true.
map() + filter()
Combinando métodos da collection via chaining
reduce()
Reduz os ítens da coleção em um único valor
each()
each()
Executa um callback para cada ítem da coleção. Se o callback retorna false, interrompe a iteração.
where()
Filtra a coleção de acordo com uma condicional
pluck()
Extrai um campo específico dos ítens da coleção. Opcionalmente determina um campo para ser chave.
pluck()
Extrai um campo específico dos ítens da coleção. Opcionalmente determina um campo para ser chave.
Outros métodos
sortBy(): ordena a coleção, sortByDesc() o faz decrescente;
take() retorna os primeiros n elementos.
Outros métodos
groupBy(): agrupa os ítens da coleção por um determinada coluna;
chunk(): agrupa os ítens de n em n.
Por que trocar loops por Collections?
Complexidade inerente ao loop
Loops tornam necessárias variáveis auxiliares, estado compartilhado e múltiplas saídas
Profundidade de identação (object calisthenics)
Loops acabam tornando difícil o exercício calistênico de reduzir a quantidade de identações.
Claridade de código (1-line where vs 6-line search)
Redução drástica da quantidade de código; fica mais claro o que cada pedaço fax e como
Reuso de métodos
Métodos e macros podem ser reutilizadas com mais facilidade.
Refatorando loops
em Collections
Formatando uma resposta JSON de acordo com permissões de usuário.
Usando foreach()
Formatando uma resposta JSON de acordo com permissões de usuário.
Usando foreach()
Dois laços de repetição
3 níveis de identação
Saída intermediária
Pra que serve isso?
Não está claro.
Variáveis intermediárias
Formatando uma resposta JSON de acordo com permissões de usuário.
Usando Collection
Formatando uma resposta JSON de acordo com permissões de usuário.
Usando Collection
Único nível de identação.
Única saída lógica
Output claro e flexível
Expressão clara
Injeção clara de
dependência
Validando e calculando um carrinho de compras.
JSON do $cart Base de dados de produtos
Validando e calculando um carrinho de compras.
Usando foreach()
Validando e calculando um carrinho de compras.
Usando foreach()
Nível adicional de identação
Mutação de estado / variável
externa
Variáveis intermediária
Repetição de tratamento
Validando e calculando um carrinho de compras.
Usando Collection
Validando e calculando um carrinho de compras.
Usando Collection
Expressão clara indicando
filtragem
Abstração injetável do
storage
Expressão clara, outras
infos disponíveis
Só um nível de identação
Função
reutilizável
Lendo e processando um arquivo CSV
Usando while
Lendo e processando um arquivo CSV
Usando while
Múltiplas saídas lógicas
Lendo e processando um arquivo CSV
Usando while
Variáveis intermediárias,
propósito não fica
imediatamente claro
Lendo e processando um arquivo CSV
Usando while
3 níveis de identação
Lendo e processando um arquivo CSV
Usando while
Expressão obscura
Lendo e processando um arquivo CSV
Usando Collection
Lendo e processando um arquivo CSV
Usando Collection
Rotina simples para fazer
o parsing do CSV
Pula a primeira linha
(cabeçalho)
Expressão clara que
combina os valores com o
cabeçalho
Expressão clara e sem
variável intermediária
1 nível de identação
Performance
- Baixo impacto de performance: a biblioteca atua apenas como "wrapper"
Sugestão: veja o código-fonte da classe e entenda o que é feito em cada operação:
https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Collection.php
- Certas operações (como processar arquivos grandes) podem ter impacto direto em performance
ao tornar necessário a representação dos dados inteiramente em arrays (ao invés de operações
chunk-by-chunk, como o fgetcsv() para CSV)
- Para dados oriundos de banco de dados, as Collections se encaixam bem com o
PDOStatement::fetch(). O ORM do Laravel retorna nativamente collections (uma classe
derivada com operações mais performáticas sobre retornos de queries).
Para concluir
- O pattern de Collections te ajuda a deixar o código mais limpo, conciso e claro;
- A biblioteca de Collections do Laravel é uma ferramenta poderosa e flexível, com uma centena de
métodos para todo tipo de operação: não precisa reinventar a roda!
- Vale a pena ficar de olho em oportunidades para refatorar seu código com Collections;
- As Collections não substituem 100% dos usos de loops, mas podem simplificar dezenas de
padrões comuns em aplicações web, APIs e daemons.
Obrigado!
Telegram: @DfKimera
E-mail / Hangouts: aryel.tupinamba@lqdi.net
Facebook: http://facebook.com/aryel.tupinamba
Twitter: http://twitter.com/DfKimera
LinkedIn: http://linkedin.com/in/aryeltupinamba
http://lqdi.net
Mais informações:
https://laravel.com/docs/5.5/collections
https://adamwathan.me/refactoring-to-collections/
http://christoph-rumpel.com/2016/11/How-I-
refactor-to-collections/
Slides da palestra: http://slideshare.net/aryeltupinamba

Mais conteúdo relacionado

Mais procurados

Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcionalNatan Mai
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para phpFabio B. Silva
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcionalLP Maquinas
 

Mais procurados (6)

Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Programação funcional no dia a dia
Programação funcional no dia a diaProgramação funcional no dia a dia
Programação funcional no dia a dia
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para php
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Ruby versus Python
Ruby versus PythonRuby versus Python
Ruby versus Python
 

Semelhante a PHP Conference 2017: Como melhorar seu código com Laravel Collections

Bancos de dados No-SQL e afins
Bancos de dados No-SQL e afinsBancos de dados No-SQL e afins
Bancos de dados No-SQL e afinsdcarneir
 
MongoDB - Performance e Escalabilidade para aplicações web
MongoDB - Performance e Escalabilidade para aplicações webMongoDB - Performance e Escalabilidade para aplicações web
MongoDB - Performance e Escalabilidade para aplicações webRafael Nunes
 
Mapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMMapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMFábio Rehm
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasjesuinoPower
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangElaine Naomi
 
Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Charles Fortes
 
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBR
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBRAvaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBR
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBRJulio Viegas
 
Automacao com Python.pdf
Automacao com Python.pdfAutomacao com Python.pdf
Automacao com Python.pdfSecont
 
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftPath to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftAmazon Web Services LATAM
 
14-programacao-bd-Object Relational Mapper.pdf
14-programacao-bd-Object Relational Mapper.pdf14-programacao-bd-Object Relational Mapper.pdf
14-programacao-bd-Object Relational Mapper.pdfgabriel-colman
 

Semelhante a PHP Conference 2017: Como melhorar seu código com Laravel Collections (20)

Bancos de dados No-SQL e afins
Bancos de dados No-SQL e afinsBancos de dados No-SQL e afins
Bancos de dados No-SQL e afins
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Slides do cuso_php
Slides do cuso_phpSlides do cuso_php
Slides do cuso_php
 
MongoDB - Performance e Escalabilidade para aplicações web
MongoDB - Performance e Escalabilidade para aplicações webMongoDB - Performance e Escalabilidade para aplicações web
MongoDB - Performance e Escalabilidade para aplicações web
 
Mapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORMMapeamento Objeto Relacional em PHP com Outlet ORM
Mapeamento Objeto Relacional em PHP com Outlet ORM
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e Lambdas
 
Workshop MongoDB
Workshop MongoDBWorkshop MongoDB
Workshop MongoDB
 
Além da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e ErlangAlém da programação funcional com Elixir e Erlang
Além da programação funcional com Elixir e Erlang
 
Apresentação faef
Apresentação faefApresentação faef
Apresentação faef
 
Apresentação faef
Apresentação faefApresentação faef
Apresentação faef
 
Palestra Sobre REST
Palestra Sobre RESTPalestra Sobre REST
Palestra Sobre REST
 
Threads - .Net Framework 4.0
Threads - .Net Framework 4.0Threads - .Net Framework 4.0
Threads - .Net Framework 4.0
 
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBR
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBRAvaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBR
Avaliando o Apache Cassandra como cache distribuido no SPC Brasil - NoSQLBR
 
Automacao com Python.pdf
Automacao com Python.pdfAutomacao com Python.pdf
Automacao com Python.pdf
 
MAC5855 - NoSQL
MAC5855 - NoSQLMAC5855 - NoSQL
MAC5855 - NoSQL
 
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon RedshiftPath to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
Path to the future #5 - Melhores práticas de data warehouse no Amazon Redshift
 
XML-RPC.pdf
XML-RPC.pdfXML-RPC.pdf
XML-RPC.pdf
 
14-programacao-bd-Object Relational Mapper.pdf
14-programacao-bd-Object Relational Mapper.pdf14-programacao-bd-Object Relational Mapper.pdf
14-programacao-bd-Object Relational Mapper.pdf
 
NoSQL Livre
NoSQL LivreNoSQL Livre
NoSQL Livre
 

Mais de Aryel Tupinambá

PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPPHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPAryel Tupinambá
 
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPPHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPAryel Tupinambá
 
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)Aryel Tupinambá
 
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)Aryel Tupinambá
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...Aryel Tupinambá
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...Aryel Tupinambá
 
Mini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe FlashMini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe FlashAryel Tupinambá
 

Mais de Aryel Tupinambá (7)

PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHPPHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP
 
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHPPHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
PHP Conference 2016: Aplicações em tempo real com o Ratchet PHP
 
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
 
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
Mini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe FlashMini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe Flash
 

PHP Conference 2017: Como melhorar seu código com Laravel Collections

  • 1. Como melhorar seu código com Laravel Collections Aryel Tupinambá PHP Conference 2017
  • 2. Sobre o palestrante Aryel Tupinambá @DfKimera Co-fundador e CTO da LQDI Digital Projetos para empresas como Porto Seguro, Nestlé, Ticket e American Express CTO da PedeSabores.com.br E-commerce de frutas, verduras, legumes e outros produtos alimentícios 13 anos trabalhando com PHP Desde a época que o PHPClasses era a onda :)
  • 3. O que são as Laravel Collections?
  • 4. O que são as Laravel Collections Representação OOP de uma array Atua como um wrapper de uma array ou data source (database, CSV/XLS, etc) Programação funcional e method chaining Uma centena de operações de busca, manipulação e transformação
  • 6. O que vem no pacote Arr Str Collection Carbon Arr::add() Arr::except() Arr::only() Arr::first() Arr::random() ... Str::finish() Str::camelCase() Str::snakeCase() Str::startsWith() Str::slug() Str::contains() ... collect() Carbon::parse('2017-12-07') $date->before() $date->add() $date->endOfMonth() $date->diffInHours() ...
  • 8.
  • 9. map() Retorna uma nova array, onde cada elemento é o resultado da função de callback (índices preservados)
  • 10. filter() Retorna uma nova array, apenas com os ítens cujo callback retornar true.
  • 11. map() + filter() Combinando métodos da collection via chaining
  • 12. reduce() Reduz os ítens da coleção em um único valor
  • 14. each() Executa um callback para cada ítem da coleção. Se o callback retorna false, interrompe a iteração.
  • 15. where() Filtra a coleção de acordo com uma condicional
  • 16. pluck() Extrai um campo específico dos ítens da coleção. Opcionalmente determina um campo para ser chave.
  • 17. pluck() Extrai um campo específico dos ítens da coleção. Opcionalmente determina um campo para ser chave.
  • 18. Outros métodos sortBy(): ordena a coleção, sortByDesc() o faz decrescente; take() retorna os primeiros n elementos.
  • 19. Outros métodos groupBy(): agrupa os ítens da coleção por um determinada coluna; chunk(): agrupa os ítens de n em n.
  • 20. Por que trocar loops por Collections? Complexidade inerente ao loop Loops tornam necessárias variáveis auxiliares, estado compartilhado e múltiplas saídas Profundidade de identação (object calisthenics) Loops acabam tornando difícil o exercício calistênico de reduzir a quantidade de identações. Claridade de código (1-line where vs 6-line search) Redução drástica da quantidade de código; fica mais claro o que cada pedaço fax e como Reuso de métodos Métodos e macros podem ser reutilizadas com mais facilidade.
  • 22. Formatando uma resposta JSON de acordo com permissões de usuário. Usando foreach()
  • 23. Formatando uma resposta JSON de acordo com permissões de usuário. Usando foreach() Dois laços de repetição 3 níveis de identação Saída intermediária Pra que serve isso? Não está claro. Variáveis intermediárias
  • 24. Formatando uma resposta JSON de acordo com permissões de usuário. Usando Collection
  • 25. Formatando uma resposta JSON de acordo com permissões de usuário. Usando Collection Único nível de identação. Única saída lógica Output claro e flexível Expressão clara Injeção clara de dependência
  • 26. Validando e calculando um carrinho de compras. JSON do $cart Base de dados de produtos
  • 27. Validando e calculando um carrinho de compras. Usando foreach()
  • 28. Validando e calculando um carrinho de compras. Usando foreach() Nível adicional de identação Mutação de estado / variável externa Variáveis intermediária Repetição de tratamento
  • 29. Validando e calculando um carrinho de compras. Usando Collection
  • 30. Validando e calculando um carrinho de compras. Usando Collection Expressão clara indicando filtragem Abstração injetável do storage Expressão clara, outras infos disponíveis Só um nível de identação Função reutilizável
  • 31. Lendo e processando um arquivo CSV Usando while
  • 32. Lendo e processando um arquivo CSV Usando while Múltiplas saídas lógicas
  • 33. Lendo e processando um arquivo CSV Usando while Variáveis intermediárias, propósito não fica imediatamente claro
  • 34. Lendo e processando um arquivo CSV Usando while 3 níveis de identação
  • 35. Lendo e processando um arquivo CSV Usando while Expressão obscura
  • 36. Lendo e processando um arquivo CSV Usando Collection
  • 37. Lendo e processando um arquivo CSV Usando Collection Rotina simples para fazer o parsing do CSV Pula a primeira linha (cabeçalho) Expressão clara que combina os valores com o cabeçalho Expressão clara e sem variável intermediária 1 nível de identação
  • 38. Performance - Baixo impacto de performance: a biblioteca atua apenas como "wrapper" Sugestão: veja o código-fonte da classe e entenda o que é feito em cada operação: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Collection.php - Certas operações (como processar arquivos grandes) podem ter impacto direto em performance ao tornar necessário a representação dos dados inteiramente em arrays (ao invés de operações chunk-by-chunk, como o fgetcsv() para CSV) - Para dados oriundos de banco de dados, as Collections se encaixam bem com o PDOStatement::fetch(). O ORM do Laravel retorna nativamente collections (uma classe derivada com operações mais performáticas sobre retornos de queries).
  • 39. Para concluir - O pattern de Collections te ajuda a deixar o código mais limpo, conciso e claro; - A biblioteca de Collections do Laravel é uma ferramenta poderosa e flexível, com uma centena de métodos para todo tipo de operação: não precisa reinventar a roda! - Vale a pena ficar de olho em oportunidades para refatorar seu código com Collections; - As Collections não substituem 100% dos usos de loops, mas podem simplificar dezenas de padrões comuns em aplicações web, APIs e daemons.
  • 40. Obrigado! Telegram: @DfKimera E-mail / Hangouts: aryel.tupinamba@lqdi.net Facebook: http://facebook.com/aryel.tupinamba Twitter: http://twitter.com/DfKimera LinkedIn: http://linkedin.com/in/aryeltupinamba http://lqdi.net Mais informações: https://laravel.com/docs/5.5/collections https://adamwathan.me/refactoring-to-collections/ http://christoph-rumpel.com/2016/11/How-I- refactor-to-collections/ Slides da palestra: http://slideshare.net/aryeltupinamba