Skip to content

Latest commit

 

History

History
100 lines (77 loc) · 4.52 KB

25-01-2021.md

File metadata and controls

100 lines (77 loc) · 4.52 KB

Anotações do dia 25-01-2021

  • Função loop pode ser utilizada para executar um laço de repetição, entretanto acredito que ela não devesse ser utilizada sendo que existe a possibilidade de você utilizar recursão como expliquei na anotação do dia 24.01.2021.

Entretanto pode existir casos que seja necessário o uso do loop, então segue um exemplo de como utiliza-lo, vamos utilizar o exemplo da função conta-numero-elementos:

A sintaxe do "loop" lembra um pouco a do "for" quando você utiliza linguagens orientada a objeto.

(defn conta-numero-elementos
  ([elementos])
   (loop [total-ate-agora 0   
          elementos-restantes elementos]
     (if (seq elementos-restantes)
       (recur (inc total-ate-agora) (next elementos-restantes))
       total-ate-agora)))

o "recur" nesse exemplo está sendo utilizado para retornar ao "loop" e executar esse bloco, a partir do "if" novamente , caso eu tivesse alguma função antes do loop ela não é executada mais de uma vez, porque está antes, se você tiver mais codigo antes do loop o nivel de complexidade ciclomatica da sua função começa a aumentar nesse caso, talvez seja necessário uma refatoração pois a sua função está com mais responsabilidade do que deveria, indo contra um dos dogmas das boas praticas de desenvolvimento de software que é single responsability.

Bom, continuando os estudos em clojure aprendi mais algumas coisas legais relacionadas a coleção:

Para isso vamos precisar de dados para fazer essa manipulação, considere criar um arquivo chamado bancodedados.clj e inserir os dados abaixo, basicamente criei três objetos para representar feriados:

(ns loja.exemplo.bancodedados)
(use 'java-time)

(def feriado1 {:id (.toString (java.util.UUID/randomUUID))
               :nome "aniversario de sp"
               :data-feriado (local-date-time 2021 1 25)
               })

(def feriado2 {:id (.toString (java.util.UUID/randomUUID))
               :nome "Natal"
               :data-feriado (local-date-time 2021 12 25)
               })

(def feriado3 {:id (.toString (java.util.UUID/randomUUID))
               :nome "Natal-2"
               :data-feriado (local-date-time 2021 12 25)
               })

(defn feriados-2021 []
  [feriado1, feriado2,feriado3])
  • Função "group-by" é utilizada para realizar agrupamentos a partir de um determinado indicador, no exemplo abaixo vamos utilizar o campo data-feriado para realizar o agrupamento, portanto a função "group-by" receberá dois argumentos uma função que será responsavel por dizer qual campo deve ser utilizado para agrupar (agrupamento-por-data) e a nossa coleção (l.db/feriados-2021).

O output será as coleções agrupadas dentro de um vetor pelo indicar que nesse caso é o campo data-feriado .

(ns exemplo.exemplo25012021
  (:require [exemplo.bancodedados :as l.db]))

(defn agrupamento-por-data
     [elemento]
     (:data-feriado elemento))

(println (group-by agrupamento-por-data (l.db/feriados-2021)))

Output:

 
{
    #object[java.time.LocalDateTime 0x1fb91a30 2021-01-25T00:00] 
    [
        {
            :id 993a0f9c-912a-42d4-bb12-6e64311ec4f4,
            :nome aniversario de sp,
            :data-feriado #object[java.time.LocalDateTime 0x1fb91a30 2021-01-25T00:00]
        }
    ], 
    #object[java.time.LocalDateTime 0x1a3872ee 2021-12-25T00:00]
    [
        {
            :id d0734804-4f9d-40dc-949e-4290e0cd0499,
            :nome Natal,
            :data-feriado #object[java.time.LocalDateTime 0x1a3872ee 2021-12-25T00:00]
        }
        {
            :id 7537d5bf-0d4c-47ff-a960-6fd346cac333,
            :nome Natal-2,
            :data-feriado #object[java.time.LocalDateTime 0x7dbfc257 2021-12-25T00:00]
        }
    ]
}

Biblioteca para manipular datas

Para gerar a data utilizei uma biblioteca chamada Clojure.Java-Time ela funciona como um wrapper para Java 8 Date-Time API, escolhi essa lib porque ela é simples de utilizar, tem poucas issues e está sendo mantida pela comunidade o ultimo era a cerca de 4 meses.

O primeiro passo para utiliza-la é referenciar no seu projeto.clj: [clojure.java-time "0.3.2"] e após utilizar o use no arquivo que você for utiliza-lo, dessa forma: (use 'java-time) a função que utilizei para preencher o campo data-feriado foi a local-date-time basicamente ela pode receber como argumento o [ano-mes-dia] ficando dessa forma:

(local-date-time 2021 12 25)