Sobre

Seção: Estrutura de dados

  • Continuidade com ED, focando agora em hashmaps e set.

Ilustração dicionário e conjuntos

Projeto: Restaurant Orders

  • Sistema para uma lancheonete, onde é possível coletar informações de venda com nome, o prato pedido e o dia da semana que foi realizado o pedido, de um arquivo CSV, coletando essas informações é possível realizar filtros, como buscar qual o dia mais movimentado, quantidade que determinado cliente, consumiu de um item em especifico ou qual item ele consumiu mais, qual dia ele nunca compareceu ao local.
🔭 Detalhes do projeto:

Inicio do projeto

Lendo o README fornecido pela trybe, vi que para ter um ganho de tempo e eficiencia, não devia começar do primeiro requisito, pois ele pedia funcionalidades, que a classe criada no requisito 2, iria executar com muito mais eficiencia que criando método por método.

Classe TrackOrders

Define o atributo principal, customers sendo um dict, pois durante todo o projeto os usuários, tinham nomes únicos, e seria a forma mais eficiente de encontrar o cliente, e capturar as informações, sem ter que percorrer todos clientes, até encontrar a informação desejada.

add_new_order

Inicialmente quando adicionando um novo pedido, verifico se o nome do cliente ja existe, caso não, criou o campo, e adiciono os dados de orders, onde adiciono cada item, com uma contagem de quantas vezes ele pediu aquele determinado prato, e um campo de days como conjunto, onde é adicionado os dias que ele pediu aquele prato, constando a presença dele naquele dia. Ao decorrer do projeto o add new order foi criando novos sub métodos, onde era necessário determinar qual o pedido era mais pedido, quais os dias eram mais frequentes, achei essa forma mais eficiente, do que quando formos consultar esses dados, ele verificar na hora, gerando complexidades de tempo de O(n), dessa forma ele somava a quantidade na hora da inserção do item, e ja comparava se aquele item se tornava o mais consumido, ou se aquele dia se tornava o mais movimentado durante a adição do pedido(). Métodos como:

  • get_most_ordered_dish_per_customer
  • get_busiest_day
  • get_least_busy_day

get_days_never_visited_per_customer

Nesse método aproveitei das propriedades do set, onde eu posso verificar a diferença entre os dias abertos e os dias que o cliente compareceu, resultando nos dias que ele não fez pedido nenhum.

Classe InventoryControl

Essa classe foi responsavel por manter um controle do estoque, para evitar pedidos onde não havia material para preparar aquele pedido, e com possibilidade de verificar a quantidade necessária para compra, mantendo um estoque mínimo.

Inicialmente criei um current inventory, onde eu atualizava internamente na classe o estoque atualmente, mas isso não fazia muito sentido, então passei o current inventory via parametro na classe, pois quando ele iniciar essa classe, ele pode ter um estoque maior do que o minimo, e não faria sentido ele pedir para comprar sendo que não estava no minimo ainda, somente usando com base o consumo dos itens conforma os pedidos eram feitos. Após um tempo de uso do sistema, ele ficaria "redondo" deixando somente o mínimo.

checking_inventory e checking_available_dishes

Com base no estoque, durante a criação da classe, eles calculava e verificava, caso ele inicie a classe com um estoque abaixo do minimo, criando a classe já com os pratos disponiveis para venda, com base no estoque, e os materiais que precisam ser comprados.

get_quantities_to_buy

Esse método acessa o atributo onde é realizado o calculo no inicio e é sempre atualizado a cada compra, dos materiais consumidos, retornando a quantidade necessária para compra, para manter o mínimo do estoque.

get_available_dishes

Assim como o get quantities, eles possui um calculo inicial com base no estoque inicial, para saber quais pratos podem ser produzidos para venda, e cada venda, ele verifica se os ingredientes estão disponveis para mais produções, evitando vendas sem a possibilidade de produzir aquele determinado prato.

add_new_order

Durante a criação de um novo pedido, ele aciona vários métodos, para verificar estoque, e movimentar o estoque antes de criar o pedido.

Tecnologias e ferramentas usadas 🛠

Python

Desafios

  • Maior desafio atual, tem sido melhor forma de buscar alguma informação de forma que não gera uma grande complexidade de tempo, mesmo sendo arquivos pequenos, sempre me pergunto, como melhorar aquela linha de código com base em complexidade.

Conclusão

  • Depois de mais de 12 meses de curso, projeto final, foi mais simples que eu esperava, mas se fosse necessário desenvolver esse mesmo projeto 12 meses atrás, quando eu iniciei na área, provavelmente eu teria bastante problemas, como sempre é gratificante demais ver que meu eu de tempos atrás agora domina bem e encontra as soluções, e que venham mais desafios!
⚠️ Configurações mínimas para execução do projeto
  • Sistema Operacional Distribuição Unix
  • Python versão >= 3.8.10
🗞️ Requisitos solicitados durante o desenvolvimento do projeto

Resultado por requisito

Nome Avaliação
1.1 - Será validado se, ao executar o método analyze_log, os dados são preenchidos de forma correta no arquivo data/mkt_campaign.txt ✔️
1.2 - Será validado se, ao executar o método analyze_log com um arquivo inexistente, o método retorna um erro ✔️
1.3 - Será validado se, ao executar o método analyze_log com uma extensão inválida, o método retorna um erro ✔️
2.1 - Será validado se, ao instanciar a classe TrackOrders pela primeira vez, o método retorna a quantidade de pedidos é igual a zero ✔️
2.2 - Será validado se, ao executar o método add_new_order, o método deve adicionar um pedido ✔️
2.3 - Será validado se, ao executar get_most_ordered_dish_per_costumer, o método retorna o prato mais pedido ✔️
2.4 - Será validado se, ao executar get_never_ordered_per_costumer, o método retorna o pedido que o cliente nunca fez ✔️
2.5 - Será validado se, ao executar get_days_never_visited_per_costumer, o método retorna o dias que o cliente nunca visitou ✔️
2.6 - Será validado se, ao executar o método get_busiest_day, o método retorna o dia mais movimentado ✔️
2.7 - Será validado se, ao executar o método get_least_busy_day, o método retorna o dia menos movimentado ✔️
3.1 - Será validado se, ao executar o método get_quantities_to_buy, o método retorna a lista atualizada de ingredientes ✔️
3.2 - Será validado se, ao executar o método get_quantities_to_buy o método retorna toda a quantidade de ingredientes há se comprar de hamburguer ✔️
3.3 - Será validado se, ao executar o método get_quantities_to_buy, o método retorna a lista atualizada dos ingredientes que usam receitas diferentes ✔️
4.1 - Será validado se, ao adicionar uma quantidade maior de ingredientes, o método retorna false ✔️
4.2 - Será validado se, ao executar o método get_available_dishes, o método retorna todos os pratos onde os pratos tem ingredientes ✔️
4.3 - Será validado se, ao executar o método get_available_dishes, não o método retorna os pratos o qual os ingredientes não sejam suficientes para prepará-los ✔️