Nubank DevTest

Dependências

docker
docker compose

Execução do projeto

docker compose up -d

Após execução do comando acima, será possível interagir com o cli do projeto, bem como visualizar o relatório de coverage em http://0.0.0.0:8000/.

Executando o cli

Como o cli foi projetado para receber os dados via stdin, basta interagir com o cli, conforme exemplos abaixo:

docker compose exec nubank-test-cli php cli/index.php < yourfile.txt
cat yourfile.txt | docker compose exec nubank-test-cli php cli/index.php
echo '[{"operation":"buy", "unit-cost":10, "quantity": 100},{"operation":"sell", "unit-cost":15, "quantity": 50},{"operation":"sell", "unit-cost":15, "quantity": 50}]' | docker compose exec nubank-test-cli php cli/index.php

Outro comando disponível é a geração do coverage, com resposta no terminal, sendo o comando abaixo:

docker compose exec nubank-test-cli php composer.phar run coverage

Sobre o projeto

O projeto foi realizado seguindo o pdf presente neste repositório e usando PHP.

Para a separação da lógica, foi utilizado alguns conceitos de Domain Driven Design.

As lógicas de análise de lucro e aplicação de taxa estão em classes de cálculos na camada de Application, porém, implementando interfaces, o que torna possível a troca por outras classes de cálculos que também implementem estas interfaces, seguindo o princípio de inversão e injeção de dependências.

Como a questão de "simplicidade" e "elegância" exigida no teste é subjetivo e eu não vi uma estruturação de dados, a persistência de dados em memória está separada em 2 classes de cálculo. Eu poderia ter optado por um repository pattern com interface na camada de domínio e a implementação como repositório em memória na camada de Infra, porém, julguei isto como over engineering, então não achei necessidade em fazer.