Successfully reported this slideshow.
Your SlideShare is downloading. ×

TDC2018SP | Trilha Go - Pratica de conjuntos: usos e tecnicas para um tipo "Set" em Go

Ad

c o n s t r u ç ã o e u s o
PRÁTICA DE CONJUNTOS
Porquê e como implementar um tipo Set na linguagem Go.
Luciano Ramalho
@r...

Ad

OBJETIVOS
1

Demonstrar como e
porque o uso de conjuntos
pode simplificar a lógica.
2

Discutir alternativas para
implement...

Ad

MOTIVAÇÃO
Quando senti saudade de conjuntos
3

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Loading in …3
×

Check these out next

1 of 75 Ad
1 of 75 Ad
Advertisement

More Related Content

More from tdc-globalcode (20)

Advertisement

TDC2018SP | Trilha Go - Pratica de conjuntos: usos e tecnicas para um tipo "Set" em Go

  1. 1. c o n s t r u ç ã o e u s o PRÁTICA DE CONJUNTOS Porquê e como implementar um tipo Set na linguagem Go. Luciano Ramalho @ramalhoorg
  2. 2. OBJETIVOS 1
 Demonstrar como e porque o uso de conjuntos pode simplificar a lógica. 2
 Discutir alternativas para implementar coleções de tipo Set em Go. 2
  3. 3. MOTIVAÇÃO Quando senti saudade de conjuntos 3
  4. 4. CASO DE USO #1 4 Exibir produto se todas as palavras da consulta apare- cerem na descrição
  5. 5. SOLUÇÃO SEM CONJUNTOS #1 Já escrevi código assim… 5
  6. 6. SOLUÇÃO SEM CONJUNTOS #2 Assim fica menos mal… 6
  7. 7. 7 Que tal se… Depois! Agora estou muito ocupado! www.workcompass.com/
  8. 8. CASO DE USO #1 8 Exibir produto se todas as palavras da consulta apare- cerem na descrição www.workcompass.com/
  9. 9. CASO DE USO #1 9 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/
  10. 10. CASO DE USO #2 10 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras.
  11. 11. CASO DE USO #2 11 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras. F ∖ C
  12. 12. CASO DE USO #3: RUNEFINDER 12 https://tgo.li/runes2018
  13. 13. CASO DE USO #3: RUNEFINDER 13 https://tgo.li/runes2018
  14. 14. CASO DE USO #3: RUNEFINDER 14 https://tgo.li/runes2018
  15. 15. CASO DE USO #3: ÍNDICE INVERTIDO
  16. 16. CASO DE USO #3: ÍNDICE INVERTIDO “REGISTERED SIGN” é o nome oficial de ® em UnicodeData.txt
  17. 17. CASO DE USO #3: ÍNDICE INVERTIDO 17www.workcompass.com/ index é o índice invertido: as chaves são palavras, e os valores são conjuntos de runas cujo nome contém a palavra. Ex. a runa ‘®’ aparece nas chaves “REGISTERED” e “SIGN”
  18. 18. CASO DE USO #3: ÍNDICE INVERTIDO 18 A ∩ B www.workcompass.com/
  19. 19. LÓGICA E CONJUNTOS Uma relação íntima 19
  20. 20. Nobody has yet discovered a branch of mathematics that has successfully resisted formalization into set theory. Thomas Forster
 Logic Induction and Sets, p. 167 20
  21. 21. Ainda não descobriram um ramo da
 matemática que não possa ser formalizado
 pela teoria dos conjuntos. Thomas Forster
 (tradução livre de Logic Induction and Sets, p. 167) 21
  22. 22. CONJUNÇÃO LÓGICA: INTERSECÇÃO x pertence à intersecção de A e B. é o mesmo que: x pertence ao conjunto A e
 x também pertence ao conjunto B. Em notação matemática: x ∈ (A ∩ B) ⟺ (x ∈ A) ∧ (x ∈ B) Em computação: AND 22
  23. 23. DISJUNÇÃO LÓGICA: UNIÃO x pertence à união de A e B. é o mesmo que: x pertence ao conjunto A e/ou
 x pertence ao conjunto B. Em notação matemática: x ∈ (A ∪ B) ⟺ (x ∈ A) ∨ (x ∈ B) Em computação: OR 23
  24. 24. DIFERENÇA SIMÉTRICA x pertence ao conjunto A ou
 x pertence ao conjunto B
 mas não pertence aos dois é o mesmo que: x pertence à união de A e B menos a intersecção de A e B. Em notação matemática:
 Em computação: XOR 24 x ∈ (A ∆ B) ⟺ (x ∈ A) ⊻ (x ∈ B)
  25. 25. DIFERENÇA x pertence ao conjunto A mas
 não pertence ao conjunto B. é o mesmo que: elementos de A menos os de B Em notação matemática: x ∈ (A ∖ B) ⟺ (x ∈ A) ∧ (x ∉ B) 25
  26. 26. CONJUNTOS EM VÁRIAS LINGUAGENS 26
  27. 27. CONJUNTOS EM VÁRIAS BIBLIOTECAS-PADRÃO Algumas linguagens/plataformas que implementam conjuntos em sua biblioteca-padrão. 27 Java Interface Set com < 10 métodos; 8 implementações Python set e frozenset com > 10 métodos e operadores .Net (C# etc.) Interface ISet com > 10 métodos; 2 implementações JavaScript (ES6) Set com < 10 métodos Ruby Set com > 10 métodos e operadores
  28. 28. CONJUNTOS “GENÉRICOS” EM GO Elementos tipo interface{} 28
  29. 29. GOLANG-SET By Ralph Caraveo (@deckarep) 29
  30. 30. 30
  31. 31. GOLANG-SET, VULGO MAPSET… 31
  32. 32. GOLANG-SET: INTERFACE SET 32 22 métodos
  33. 33. threadUnsafeSet threadSafeSet GOLANG-SET: IMPLEMENTAÇÕES 33
  34. 34. GOLANG-SET: CODE REVIEW 34 elementos tipo interface{}
  35. 35. GOLANG-SET: EXEMPLO 35
  36. 36. GOLANG-SET: MORE CODE REVIEW 36
  37. 37. GOLANG-SET: CODE REVIEW 37
  38. 38. GOLANG-SET: CODE REVIEW 38
  39. 39. GODS Go Data Structures 39
  40. 40. 40 elementos tipo interface{}
  41. 41. GODS: PACKAGE SETS 41 interface:
 7 métodos 2 implementações: HashSest, TreeSet
  42. 42. GEN Type-driven code generation for Go 42
  43. 43. GEN: GERADOR DE CÓDIGO COM TIPOS PARAMETRIZADOS 43
  44. 44. GEN: MODO DE USAR 1. Marque o seu código com comentários especiais: 
 
 
 
 
 2. Execute o comando gen 
 3. Adicione ao seu projeto o arquivo .go gerado 44 Exemplo em: https://tgo.li/2vtcMjw
  45. 45. GEN: MEU CÓDIGO FONTE (CODEPOINTS.GO) 45 Exemplo em: https://tgo.li/2vtcMjw
  46. 46. GEN: O ARQUIVO GERADO (CODEPOINT_SET.GO) 46 Exemplo em: https://tgo.li/2vtcMjw código derivado
 de golang-set
  47. 47. CONJUNTOS ESPECIALIZADOS 47
  48. 48. MAP CRU 48
  49. 49. USO DE MAP COMO CONJUNTO Chaves de um map formam um conjunto
 com duas características essenciais: •Garantia de unicidade: 
 uma chave só pode ocorrer uma vez. •Verificação de pertencimento em O(1): 
 tempo praticamente constante independente do número de elementos.
 
 
 
 Demais métodos? Fique à vontade para implementar! 49 if _, existe := conjunto[elem]; existe { // o elemento está no conjunto }
  50. 50. USO DE MAP COMO CONJUNTO Chaves de um map formam um conjunto
 com duas características essenciais: •Garantia de unicidade: 
 uma chave só pode ocorrer uma vez. •Verificação de pertencimento em O(1): 
 tempo praticamente constante independente do número de elementos.
 
 
 
 Demais métodos? Fique à vontade para implementar! 50 Curiosidade:
 era assim que a gente se virava em Python até 2003 — usando chaves de um dict como um conjunto! if _, existe := conjunto[elem]; existe { // o elemento está no conjunto }
  51. 51. RELEMBRANDO: CASO DE USO #1 51 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/
  52. 52. SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 52 map de <tipo-elemento> para struct{}
  53. 53. SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 53 preencher o
 “conjunto”
  54. 54. SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 54 busca em O(1)
  55. 55. MAP COM NOME standupdev/runeset 55
  56. 56. RUNESET: TIPO MAP COM NOME E MÉTODOS 56 10 métodos, incluindo: Intersection, IntersectionUpdate
  57. 57. RUNESET: CARACERÍSTICAS Não encapsula o map: pode acessado e modificado direto.
 Sintaxe melhor para criar e testar elementos: 
 Exemplo: 57 s.Add(e)
 s.Contains(e) https://github.com/standupdev/runeset
  58. 58. RUNESET: DEFINIÇÃO DO TIPO E MÉTODOS ESSENCIAIS 58 https://github.com/standupdev/runeset elementos do tipo rune
  59. 59. RUNESET: CONSTRUTORES Convenção: Usar Make para criar objetos manipulados por referências. 59 https://github.com/standupdev/runeset cria um
 Set vazio
  60. 60. MakeFromString: set de runas a partir de string RUNESET: CONSTRUTORES 60 custo zero para passar uma slice: runas…
  61. 61. RUNESET: INTERSECÇÃO 61 https://github.com/standupdev/runeset
  62. 62. RUNESET: USO EM ÍNDICE INVERTIDO (CASO DE USO #3)
  63. 63. RUNESET: MÉTODOS ÚTEIS Além de operações da teoria dos conjuntos…
 MakeFromString: construtor que aceita string.
 Sorted: devolve slice de runas em ordem ascendente String: elementos ordenados para facilitar exemplos.
 Equal: facilita muito os testes.
 Copy: importante especialmente em coleções mutáveis. 63
  64. 64. MAP ENCAPSULADO 64
  65. 65. STRSET: TIPO MAP ENCAPSULADO EM STRUCT 65 26 métodos
  66. 66. STRSET: CARACTERÍSTICAS Protege o map: campo privado só pode acessado via métodos e funções do mesmo pacote.
 Não é prático construir com a sintaxe Set{}: 
 melhor usar Make(). 
 Exemplo: 66 https://github.com/standupdev/strset
  67. 67. DEFINIÇÃO DO TIPO E CONSTRUTORES 67 https://github.com/standupdev/strset
  68. 68. ORGANIZAÇÃO DO PACOTE STRSET Nota: todos os métodos que modificam um Set depois de criado estão no arquivo updaters.go. 68 core.go Make, Len, Contains, String, Equal, Copy, ToSlice, Channel operators.go Intersection, Union,
 Difference, SymmetricDifference relations.go SubsetOf, SupersetOf updaters.go Add, AddAll, Remove, RemoveAll, Pop, Clear, IntersectionUpdate, UnionUpdate, DifferenceUpdate, SymmetricDifferenceUpdate https://github.com/standupdev/strset
  69. 69. COMPARAR APIS PARA ESCOLHER NOMES DE MÉTODOS 69
  70. 70. RUNESCAN: EXEMPLO DE USO DE STRSET 70
  71. 71. 71
  72. 72. CONCLUSÃO 72
  73. 73. CONJUNTOS NA PRÁTICA Operações de conjunto podem simplificar sua lógica golang-set (@deckarep): a implementação rica mais popular gen pode produzir um golang-set específico para seu tipo Codar um tipo set é um ótimo exercício de programação Se precisar de Set para elementos string, pode usar strset 73 https://github.com/standupdev/strset
  74. 74. FICÇÃO CIENTÍFICA Bom mesmo seria isso… 74 var s1 set[string] s2 := make(set[uint64])
  75. 75. Luciano Ramalho
 @ramalhoorg | @standupdev
 luciano.ramalho@thoughtworks.com MUITO GRATO!

×