Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

MOTIVAÇÃO Quando senti saudade de conjuntos 3

Slide 4

Slide 4 text

CASO DE USO #1 4 Exibir produto se todas as palavras da consulta apare- cerem na descrição

Slide 5

Slide 5 text

SOLUÇÃO SEM CONJUNTOS #1 Já escrevi código assim… 5

Slide 6

Slide 6 text

SOLUÇÃO SEM CONJUNTOS #2 Assim fica menos mal… 6

Slide 7

Slide 7 text

7 Que tal se… Depois! Agora estou muito ocupado! www.workcompass.com/

Slide 8

Slide 8 text

CASO DE USO #1 8 Exibir produto se todas as palavras da consulta apare- cerem na descrição www.workcompass.com/

Slide 9

Slide 9 text

CASO DE USO #1 9 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/

Slide 10

Slide 10 text

CASO DE USO #2 10 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras.

Slide 11

Slide 11 text

CASO DE USO #2 11 Marcar todos os produtos favoritados, exceto os que já estiverem no carrinho de compras. F ∖ C

Slide 12

Slide 12 text

CASO DE USO #3: RUNEFINDER 12 https://tgo.li/runes2018

Slide 13

Slide 13 text

CASO DE USO #3: RUNEFINDER 13 https://tgo.li/runes2018

Slide 14

Slide 14 text

CASO DE USO #3: RUNEFINDER 14 https://tgo.li/runes2018

Slide 15

Slide 15 text

CASO DE USO #3: ÍNDICE INVERTIDO

Slide 16

Slide 16 text

CASO DE USO #3: ÍNDICE INVERTIDO “REGISTERED SIGN” é o nome oficial de ® em UnicodeData.txt

Slide 17

Slide 17 text

CASO DE USO #3: ÍNDICE INVERTIDO 17 www.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”

Slide 18

Slide 18 text

CASO DE USO #3: ÍNDICE INVERTIDO 18 A ∩ B www.workcompass.com/

Slide 19

Slide 19 text

LÓGICA E CONJUNTOS Uma relação íntima 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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)

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

CONJUNTOS EM VÁRIAS LINGUAGENS 26

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

CONJUNTOS “GENÉRICOS” EM GO Elementos tipo interface{} 28

Slide 29

Slide 29 text

GOLANG-SET By Ralph Caraveo (@deckarep) 29

Slide 30

Slide 30 text

30

Slide 31

Slide 31 text

GOLANG-SET, VULGO MAPSET… 31

Slide 32

Slide 32 text

GOLANG-SET: INTERFACE SET 32 22 métodos

Slide 33

Slide 33 text

threadUnsafeSet threadSafeSet GOLANG-SET: IMPLEMENTAÇÕES 33

Slide 34

Slide 34 text

GOLANG-SET: CODE REVIEW 34 elementos tipo interface{}

Slide 35

Slide 35 text

GOLANG-SET: EXEMPLO 35

Slide 36

Slide 36 text

GOLANG-SET: MORE CODE REVIEW 36

Slide 37

Slide 37 text

GOLANG-SET: CODE REVIEW 37

Slide 38

Slide 38 text

GOLANG-SET: CODE REVIEW 38

Slide 39

Slide 39 text

GODS Go Data Structures 39

Slide 40

Slide 40 text

40 elementos tipo interface{}

Slide 41

Slide 41 text

GODS: PACKAGE SETS 41 interface:
 7 métodos 2 implementações: HashSest, TreeSet

Slide 42

Slide 42 text

GEN Type-driven code generation for Go 42

Slide 43

Slide 43 text

GEN: GERADOR DE CÓDIGO COM TIPOS PARAMETRIZADOS 43

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

GEN: MEU CÓDIGO FONTE (CODEPOINTS.GO) 45 Exemplo em: https://tgo.li/2vtcMjw

Slide 46

Slide 46 text

GEN: O ARQUIVO GERADO (CODEPOINT_SET.GO) 46 Exemplo em: https://tgo.li/2vtcMjw código derivado
 de golang-set

Slide 47

Slide 47 text

CONJUNTOS ESPECIALIZADOS 47

Slide 48

Slide 48 text

MAP CRU 48

Slide 49

Slide 49 text

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 }

Slide 50

Slide 50 text

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 }

Slide 51

Slide 51 text

RELEMBRANDO: CASO DE USO #1 51 Exibir produto se todas as palavras da consulta apare- cerem na descrição Q ⊂ D www.workcompass.com/

Slide 52

Slide 52 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 52 map de para struct{}

Slide 53

Slide 53 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 53 preencher o
 “conjunto”

Slide 54

Slide 54 text

SOLUÇÃO COM MAP FAZENDO PAPEL DE CONJUNTO Solução mais eficiente que as anteriores, para slices grandes: 54 busca em O(1)

Slide 55

Slide 55 text

MAP COM NOME standupdev/runeset 55

Slide 56

Slide 56 text

RUNESET: TIPO MAP COM NOME E MÉTODOS 56 10 métodos, incluindo: Intersection, IntersectionUpdate

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

RUNESET: DEFINIÇÃO DO TIPO E MÉTODOS ESSENCIAIS 58 https://github.com/standupdev/runeset elementos do tipo rune

Slide 59

Slide 59 text

RUNESET: CONSTRUTORES Convenção: Usar Make para criar objetos manipulados por referências. 59 https://github.com/standupdev/runeset cria um
 Set vazio

Slide 60

Slide 60 text

MakeFromString: set de runas a partir de string RUNESET: CONSTRUTORES 60 custo zero para passar uma slice: runas…

Slide 61

Slide 61 text

RUNESET: INTERSECÇÃO 61 https://github.com/standupdev/runeset

Slide 62

Slide 62 text

RUNESET: USO EM ÍNDICE INVERTIDO (CASO DE USO #3)

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

MAP ENCAPSULADO 64

Slide 65

Slide 65 text

STRSET: TIPO MAP ENCAPSULADO EM STRUCT 65 26 métodos

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

DEFINIÇÃO DO TIPO E CONSTRUTORES 67 https://github.com/standupdev/strset

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

COMPARAR APIS PARA ESCOLHER NOMES DE MÉTODOS 69

Slide 70

Slide 70 text

RUNESCAN: EXEMPLO DE USO DE STRSET 70

Slide 71

Slide 71 text

71

Slide 72

Slide 72 text

CONCLUSÃO 72

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

FICÇÃO CIENTÍFICA Bom mesmo seria isso… 74 var s1 set[string] s2 := make(set[uint64])

Slide 75

Slide 75 text

Luciano Ramalho
 @ramalhoorg | @standupdev
 [email protected] MUITO GRATO!