# Builder

# Histórico de Versão

Data Autor(es) Descrição Versão
26/10/2020 Fábio Teixeira(fabio1079) Adicionando utilização do builder no projeto 0.1
26/10/2020 Cauê(caue96) Incrementando a introdução do que é o padrão builder 0.2
16/11/2020 Lucas(lucasmidlhey) Justificativa 0.3

# Introdução

  O Builder é um padrão de criacional que permite construir objetos complexos. O padrão permite que você produza diferentes tipos e representações de um objeto usando o mesmo código de construção.

  O padrão Builder sugere que se extraia o código de construção do objeto para fora de sua própria classe e mova ele para objetos separados chamados construtores ou builders.

# Estrutura

Estrutura Strategy

# Aplicações no Projeto(QRodízio)

# Disclaimer

Primeiramente é bom deixar claro que nosso projeto está utilizando de linguagens multi-paradigmas(python e javascript) sendo assim, adaptações aos padrões são necessárias para não fugir do estilo do código utilizado.

A Linguem python possui em seu "zen of python" a seguinte declaração: "Simple is better than complex". Seguindo essa filosifia, decidimos que, se algo pode ser feito em uma função, então será feito em uma função. Assim mantendo um código mais limpo, simples e fácil de manter.

# Utilização

Em nossa base de código percemos que a API estava tendo muito código repetido e verboso para instancia os models, sendo assim optamos em exportar essa instanciação mais verbosa para builders para cada model.

Uma vantagem é que esses mesmos builders acabaram por ser utilizado tanto nos comandos de ternimal quanto nos testes unitários.

Segue um exemplo de um de nossos builders:

def customer_tables_builder(**customer_table_atrrs):
    customer_table = CustomerTable()

    sessions_data = customer_table_atrrs["sessions"]
    del customer_table_atrrs["sessions"]

    for session_data in sessions_data:
        session = TableSession()

        for key in session_data.keys():
            setattr(session, key, session_data[key])

        customer_table.sessions.append(session)

    for key in customer_table_atrrs.keys():
        setattr(customer_table, key, customer_table_atrrs[key])

    return customer_table

def employee_builder(**employee_attrs):
  ...

def menus_builder(**menu_attrs):
  ...

def demand_builder(**demand_attrs):
  ...

# Justificativa

Utilizar esse padrão foi de suma importancia para popular o banco de dados, tendo apenas um trabalho no inicio que foi de criar este padrão e depois para qualquer novo teste com as models foi bem mais simples em nível de código.

# Referências

  • REFACTORING.GURU. Strategy. Disponível em: https://refactoring.guru/pt-br/design-patterns/builder . Acesso em: 26 de outubro. 2020.