O maior desafio do OOP se chama abstração. Injeção de depedência é uma delas. Esses conceitos você vai aprender ao longo da carreira, aplicando nos softwares e fazendo over-enginnering. Só assim que aprende!
Isso não é Java, okay? São conceitos que são aplicados de forma geral. E alguns deles não só em OOP.
Bem, foi assim que eu aprendi. Cada um tem sua história e acredito que isso pode agregar para alguém. Não existe um cenário perfeito. Que tal você contribuir aqui também?
Acho que ele sabe o que significa e quis realmente dizer isso. A gente só aprende mesmo fazendo over-engineering, porque na prática, nem 5% dos cenários reais necessitam de tanta abstração.
Eu particularmente, concordo. Quando estou estudando algo, faço over-engineering para fixar o "absurdo", mas no trabalho busco a simplicidade. Com isso, tenho os "extremos" da aplicabilidade.
Eu gosto de pensar de maneira simples que injeção de dependência remove o new do código e passa a responsabilidade de gerenciar um objeto para um framework (no meu caso, utilizo o spring, ele instância e gerencia meus objetos).
Também vou por essa linha. E pra quem chama aquela classe na teoria poderia passar uma outra implementação que fizesse mais sentido, desde que o contrato fosse o mesmo.
Tem muita coisa rolando por trás, mas você pode entender melhor criando uma injeção de dependência na mão.
Por baixo dos panos, o framework (springboot por exemplo) prepara toda abstração para você, mas você pode criar a sua própria injeção de dependência com a linguagem pura (Java, c# etc).
Estas frameworks deixam tudo preparado para que você não precise implementar a programação mais pesada, mas você pode fazer isso.
Peça para o chat gpt te recomendar artigos que expliquem de forma técnica de injeção de dependência. Inclusive, você pode fazer isso com qualquer outro tipo de abstração.
Aprende Spring puro antes de aprender o Spring boot, ele te dá uma ideia melhor de como as coisas funcionam. Recomendo o livro " Spring start here", ele é bem didático e cobre bem os fundamentos do Spring core e spring web
creio que isso acontece pq o conceito é ensinado sem contexto histórico.
em grandes sistemas vc tem um main que inicializa objetos que sao usados por vários serviços: ex, conexão com o BD. vc fazia la o new
do BD e passava isso pra services qnd vc inicializava eles
o problema é que esse main ficava gigantesco e atrasava a inicialização do sistema. e vc colocava nele a responsabilidade de preparar as dependencias e garantir ordem.
no lugar disso criamos frameworks para cuidar dessa etapa do sistema. cada servico ou classe diz o que precisa ao ser incializada e o sistema de injecao de dependencia incializa esses objetos pra vc e injeta.
dai o que é complicado: as mesmas coisas que vc tinha qnd precisava fazer manualmente... nao pode criar dep circular.. nao pode ter ingestão sensivel a estado...
e agora vem uma complicação particular de java: java tem 3 maneiras distintas de fazer injeção. autowired (spring) resource (EE) e inject (JSR). o segredo é manter uma e seguir com ela. todas elas tem alguns graus de personalização: vc quer inserir só se baseando na classe.. vc quer identificar a ingestao por nome ou por tipo ou usar um setter especializado pra isso.
entendendo isso... ajuda mais a consolidar o conceito.
Injeção de dependência é uma das melhores coisas para facilitar a vida de quem programa, mas se você está aprendendo java, pode pular isso por enquanto. Só tenha em mente que quando você cria alguma dependência dentro de uma classe com new, essa dependência só pode ser modificada se você editar a classe, alterar e recompilar. Na maioria das vezes, não seria muito mais interessante receber essa dependência no momento em que a classe fosse instanciada?
é só pensar que em vez de ter uma instância concreta chamada Pix dentro da classe você vai receber uma instância de algo que segue o contrato MétodoDePagamento e ele pode ser qualquer coisa que siga esse contrato (Pix, CreditCard, DebitCard, Boleto).
Você geralmente não vai colocar para esperar um método de pagamento do tipo Pix na classe porque isso engessaria ela limitando a só esse tipo. Em vez disso coloca MétodoDePagamento
Então eu abstraio o método ? ele pode receber qualquer tipo de instância de MetodoDePagamento, invés de criar um método pra cada. Eu sempre faço isso, mas sei se uso o conceito de forma correta.
O conceito mais difícil para mim sem sombra de dúvidas foi Garbage Collector.
O mais difícil até agora foi abrir Heap com MAT/jProfiller e estudar os grafos identificando e limpando classloaders leaks.
Além disso, usar JFR para analisar a JVM em tempo real e como está a rotina de limpeza de memória é absurdamente mais denso e difícil que uma mera injeção de dependência ou design Pattern (minha opinião tá?).
Perto de grafos, considero injeção de dependências bem suave, explicando oq vc entende desse conceito e quais partes vc mais costuma revisar, fica mais fácil de outras pessoas trazerem um saber mais consolidado pro seu contexto nesse quesito.
O maior desafio do OOP se chama abstração. Injeção de depedência é uma delas. Esses conceitos você vai aprender ao longo da carreira, aplicando nos softwares e fazendo over-enginnering. Só assim que aprende!
Isso não é Java, okay? São conceitos que são aplicados de forma geral. E alguns deles não só em OOP.
Pode fechar o post
https://preview.redd.it/pezjyqgs1k9g1.png?width=640&format=png&auto=webp&s=0d32da44b2a4b310634e4bc58f5242a73d7ac866
Deixa o post decidir o que é melhor pra ele
brabo, sou iniciante na programacao, to estudando Java e contruindo uma aplicacao completa, n sabia q nas outras linguagens tbm existia isso
galera usa as palavras sem nem saber oq elas significam e o pior é o tanto de idiota dando upvote numa besteira dessas 😵💫
Bem, foi assim que eu aprendi. Cada um tem sua história e acredito que isso pode agregar para alguém. Não existe um cenário perfeito. Que tal você contribuir aqui também?
Acho que ele sabe o que significa e quis realmente dizer isso. A gente só aprende mesmo fazendo over-engineering, porque na prática, nem 5% dos cenários reais necessitam de tanta abstração.
Eu particularmente, concordo. Quando estou estudando algo, faço over-engineering para fixar o "absurdo", mas no trabalho busco a simplicidade. Com isso, tenho os "extremos" da aplicabilidade.
Eu gosto de pensar de maneira simples que injeção de dependência remove o new do código e passa a responsabilidade de gerenciar um objeto para um framework (no meu caso, utilizo o spring, ele instância e gerencia meus objetos).
Também vou por essa linha. E pra quem chama aquela classe na teoria poderia passar uma outra implementação que fizesse mais sentido, desde que o contrato fosse o mesmo.
a minha dificuldade mora ai, o maior obstáculo é entender as "automações" q as anotacoes Spring fazem, pq na Poo isolada vc fazia "manualmente" tudo
Tem muita coisa rolando por trás, mas você pode entender melhor criando uma injeção de dependência na mão.
Por baixo dos panos, o framework (springboot por exemplo) prepara toda abstração para você, mas você pode criar a sua própria injeção de dependência com a linguagem pura (Java, c# etc).
Estas frameworks deixam tudo preparado para que você não precise implementar a programação mais pesada, mas você pode fazer isso.
Peça para o chat gpt te recomendar artigos que expliquem de forma técnica de injeção de dependência. Inclusive, você pode fazer isso com qualquer outro tipo de abstração.
Aprende Spring puro antes de aprender o Spring boot, ele te dá uma ideia melhor de como as coisas funcionam. Recomendo o livro " Spring start here", ele é bem didático e cobre bem os fundamentos do Spring core e spring web
creio que isso acontece pq o conceito é ensinado sem contexto histórico.
em grandes sistemas vc tem um main que inicializa objetos que sao usados por vários serviços: ex, conexão com o BD. vc fazia la o new do BD e passava isso pra services qnd vc inicializava eles
o problema é que esse main ficava gigantesco e atrasava a inicialização do sistema. e vc colocava nele a responsabilidade de preparar as dependencias e garantir ordem.
no lugar disso criamos frameworks para cuidar dessa etapa do sistema. cada servico ou classe diz o que precisa ao ser incializada e o sistema de injecao de dependencia incializa esses objetos pra vc e injeta.
dai o que é complicado: as mesmas coisas que vc tinha qnd precisava fazer manualmente... nao pode criar dep circular.. nao pode ter ingestão sensivel a estado...
e agora vem uma complicação particular de java: java tem 3 maneiras distintas de fazer injeção. autowired (spring) resource (EE) e inject (JSR). o segredo é manter uma e seguir com ela. todas elas tem alguns graus de personalização: vc quer inserir só se baseando na classe.. vc quer identificar a ingestao por nome ou por tipo ou usar um setter especializado pra isso.
entendendo isso... ajuda mais a consolidar o conceito.
até agr só aprendi o autowired
com o tempo isso vai entrar mais fácil na sua cabeça!
Não sei qual seu tempo de experiência, mas trabalho com pessoas formadas e anos de experiência que não entendem isso até hoje
Então?! Calmaria, um dia você vai aprender
Injeção de dependência é uma das melhores coisas para facilitar a vida de quem programa, mas se você está aprendendo java, pode pular isso por enquanto. Só tenha em mente que quando você cria alguma dependência dentro de uma classe com new, essa dependência só pode ser modificada se você editar a classe, alterar e recompilar. Na maioria das vezes, não seria muito mais interessante receber essa dependência no momento em que a classe fosse instanciada?
é só pensar que em vez de ter uma instância concreta chamada Pix dentro da classe você vai receber uma instância de algo que segue o contrato MétodoDePagamento e ele pode ser qualquer coisa que siga esse contrato (Pix, CreditCard, DebitCard, Boleto).
Você geralmente não vai colocar para esperar um método de pagamento do tipo Pix na classe porque isso engessaria ela limitando a só esse tipo. Em vez disso coloca MétodoDePagamento
Agora usa esse exemplo pra outras coisas também.
Então eu abstraio o método ? ele pode receber qualquer tipo de instância de MetodoDePagamento, invés de criar um método pra cada. Eu sempre faço isso, mas sei se uso o conceito de forma correta.
Cara, sou Dev Java a apenas 3 anos.
O conceito mais difícil para mim sem sombra de dúvidas foi Garbage Collector.
O mais difícil até agora foi abrir Heap com MAT/jProfiller e estudar os grafos identificando e limpando classloaders leaks.
Além disso, usar JFR para analisar a JVM em tempo real e como está a rotina de limpeza de memória é absurdamente mais denso e difícil que uma mera injeção de dependência ou design Pattern (minha opinião tá?).
Tenta aprender o do .net então kkk no Java vc consegue resolver em 1 linha com Spring
Perto de grafos, considero injeção de dependências bem suave, explicando oq vc entende desse conceito e quais partes vc mais costuma revisar, fica mais fácil de outras pessoas trazerem um saber mais consolidado pro seu contexto nesse quesito.
nem lembro q parada eh essa, é quando tu bota a instancia do objeto pra dentro da classe?
Basicamente.
Em grandes frameworks geralmente vc programa com uma interface e deixa o framework gerenciar as classes. Nenhum bixo de sete cabeças.
Mano é só pensar simples, programação é manipulação de dados para virarem informação, é tudo tão simples, é só a sua cabeça complicando