GithubHelp home page GithubHelp logo

bhub-payment's Introduction

Desafio de Solução Tech - BHub

1. Como você pode domar essas regras de negócios que mudam o tempo todo e novas podem surgir a qualquer momento?

Eu usei dois design patterns, o Observer e Chain of responsibility. Com o primeiro, fiz com que os "observadores" reagissem (tomassem ações) quando forem assinados (subscribed). Assim, quando múltiplas ações forem necessárias, a ação em si está isolada em um escopo menor e só é chamado quando "assinado". Isso pode ser visto no arquivo observer.go. Caso uma nova regra de negócio seja adicionada, um novo observer deve ser criado e executará quando entrar na condição requerida. Para tratar as condições, usei o design pattern chain of responsibility como pode ser visto no arquivo subscribers_chain. Esse pattern auxilia para deixar mais limpo uma tomada de decisão muito longa, como no caso do projeto proposto, onde várias regras podem ser adicionadas. Ao invés de usar uma infinidade de if/else, ou mesmo um switch, quando uma nova condição for necessária, basta criar uma nova Chain e adicionar no ciclo. Um chain chama o próximo chain, até que não hajam mais responsabilidades.

2. Como você pode construir um sistema que seja flexível o suficiente para lidar com acomplexidade e a necessidade dessas mudanças?

Usando os patterns descrito acima, o código tem uma manutenção razoável porque cada interação com o pagamento é isolada, necessitando apenas que caia na condição específica. Se uma nova regra de negócio for adicionado, basta criar um novo observer e adicionar a condição em forma de chain of responsibility e adicionar ao fluxo.

3. Como você pode fazer isso sem se condenar a vários anos de suporte ao sistema?

Deixando o código com apenas uma responsabilidade e testando os comportamentos esperados dado uma condição. Se algo no futuro mudar, como adicionar ou mesmo remover regras, basta corrigir o chain of responsibility e criar/remover os observers.

Notas:

  • Desculpa ter feito em Go, eu teria feito em Python mas preferi fazer com uma linguagem que está mais a mão.
  • Os arquivos observer.go contém todos os observers, num projeto real estaria isolado em vários arquivos. Decidi agrupar todos para não obrigar o revisor a abrir vários arquivos para análise. Segui a mesma ideia com o subscribers.go.
  • Não ficou muito claro o que significava guia de remessa, então tratei como uma string qualquer.
  • o modelo product está muito amplo, podendo ser uma adesão ou um produto. Não pensei numa melhor maneira de deixá-lo mais específico, mas estou ciente que poderia ser melhorado.
  • O método main tem 2 exemplos, os testes podem ser mais úteis para ver como as coisas estão funcionando.

bhub-payment's People

Contributors

jonss avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.