Giter VIP home page Giter VIP logo

pilares-design-codigo's Introduction

Meus pilares para a criação de um código

  • Qualidade não é negociável. O código deve ser feito com o design proporcional a complexidade considerando os conhecimentos que temos no momento na produção

  • Você vai deixar decisões ruins pelo caminho, não importa seu nível.

  • A prioridade máxima é funcionar de acordo com o caso de uso.

  • Execute o seu código o mais rápido possível. Priorize implementar de fora para dentro, dessa forma você visualiza o que realmente precisa e usa uma abordagem mais incrmental. O "fora" aqui pode ser o endpoint que vai receber uma chamada, pode ser seu teste automatizado...

  • Protegemos as bordas do sistema como se não houvesse amanhã.

  • Quanto mais externa a borda, mais proteção temos.

  • Não retornamos nulo dentro das regras da aplicação. Pense que seu computador vai explodir.

  • Separamos as bordas externas do sistema do seu núcleo. Não ligamos parâmetros de requisição externa com objetos de domínio diretamente, assim como não serializamos objetos de domínio para respostas de API.

  • Medimos e avaliamos de maneira tangível o nível de legibilidade do código Aqui não existe espaço feeling. O que é para ser medido precisa ser entendido e o mecanismo de avaliação em cima da medição também precisa ser nítido. Uma leitura que explica melhor a origem deste pensamento está aqui https://github.com/asouza/pilares-design-codigo/blob/master/ddd-da-massa.md

  • Utilizamos o CDD para facilitar o processo de medição e avaliação de legibilidade.

  • Toda indireção tende a aumentar a dificuldade de entendimento da aplicação como um todo, ela precisa merecer existir. Ou seja, precisa ajudar a distribuir a complexidade pelo sistema.

  • Usamos o construtor para criar o objeto no estado válido.

  • Usamos tudo que conhecemos que está pronto. Só fazemos código do zero se for estritamente necessário.

  • Idealmente, todo código escrito deveria ser chamado por alguém. Se não tem ninguém chamando, ele não deveria existir.

  • Só alteramos estado de referências que criamos. Não mexemos nos objetos alheios. A não ser que esse objeto seja criado para isso.

  • A versão mais eficiente de uma pessoa programando é aquela que entende, questiona, refina e, uma vez combinado, implementa estritamente o que foi combinado. Não inventamos coisas que não foram pedidas e não fazemos suposição de funcionalidade.

  • Você precisa entender o que está usando e olhar sempre o lado negativo de cada decisão.

  • Deixamos pistas que facilitem o uso do código onde não conseguimos resolver com compilação.

  • A sua api deve deixar claro o caminho que deve ser seguido pelo ponto do código que decide usá-la. Não espere que ninguém lembre de invocar nada. Faça de tudo para gerar obrigações. Pense em API's não democráticas.

  • Sinalizamos de maneria nítida quando um problema, de qualquer natureza, acontece na execução de um fluxo. Você pode sinalizar com exceptions, abstrações extras etc.

  • Regras de negócio devem ser declaradas de maneira explícita na nossa aplicação.

  • Favorecemos a coesão através do encapsulamento.

  • Criamos testes automatizados para aumentar a confiabilidade da aplicação e, consequentemente, aumentar a confiança da equipe para realizar as alterações que são necessárias.

  • Testes automatizados devem ser derivados de maneira pragmática através das técnicas já conhecidas. Só depois de derivar casos padrões, usamos nossa criatividade para buscar extrapolar.

Informações complementares

pilares-design-codigo's People

Contributors

asouza avatar diegorsousa avatar jeancsanchez avatar rafelluiz avatar renatoassis01 avatar rogeriogentil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pilares-design-codigo's Issues

Roadmap CDD

Seria legal ter um roadmap com os próximos passos para o avanço do CDD, artigos futuros, ferramentas que irão ser construídas e outras coisas relacionadas.

Exemplo demonstrado não compilaria.

Fala alberto, beleza?!

Espero que tenha entendido a ideia do artigo, porém o que me deixou confuso é nesta parte que você retira as dependências
do controller, porém mantem esse trecho de código`
dataBinder.addValidators(new VerificaSeCompraJaEstaConcluidaValidator(compraRepository));
Nesse cenário, o compraRepository foi extraído do Controller para utilização do EntityManager.
Fazendo com que o exemplo proposto não compilasse.

@RestController
public class RetornoPagamentoPagSeguroController {

@PersistenceContext
private EntityManager manager;

@Autowired
private ApplicationEventPublisher applicationEventPublisher;

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.addValidators(new VerificaSeCompraJaEstaConcluidaValidator(compraRepository));
}

@PostMapping(value = {"/api/retorno-pagamento/{compraId}/pagseguro"})
@Transactional
public void processaRetorno(@PathVariable("compraId") Long compraId, @Valid RetornoPagamentoPagSeguroRequest retornoPagamentoPagSeguroRequest, UriComponentsBuilder uriComponentsBuilder) {

    Compra compra = manager.find(compraId,Compra.class);

    Pagamento pagamento = retornoPagamentoPagSeguroRequest.criaPagamento(compra);
    manager.persist(pagamento);

    applicationEventPublisher.publishEvent(new NovoPagamentoEvent(this, pagamento, uriComponentsBuilder));
}

}`

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.